iOS开发:NSTimer,计时器的使用

       在开发过程中,计时器的使用也是比较普遍的,在苹果自带的Foundation框架中有一个计时器专用的类NSTimer,NSTimer的使用也很简单,比如使用计时器来做手机验证码的倒计时操作,轮播图的定时,也可以指定执行任何任务的延迟时间间隔,还可以循环重复运行任务,以及指定绝对的时间和日期等功能,NSTimer可以精确到50-100毫秒,所以说计时器的准确性还是可以的,本节就来讲讲NSTimer的使用。
        一、NSTimer的初始化创建
       计时器的使用要和“运行循环”相互关联,运行循环到一定时候会触发任务,创建NSTimer的时候,可以将它“预先安排”在当前的运行循环之中,还可以先创建再由开发者自己来调度使用。无论哪种方式,只有把计时器放到运行循环中,计时器才能正常的触发任务。
        1、初始化计时器

    (1)官方API的两个方法:
    + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo;
    + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo;

        注意:不用scheduled方式初始化的,需要手动addTimer:forMode: 将timer添加到一个runloop中;而有scheduled的初始化方法将可以默认mode直接添加到当前的runloop中。

    (2)具体实例如下所示:

    @property (nonatomic, strong) NSTimer *timer; //声明计时器属性

    方法一:
    self.timer = [NSTimer timerWithTimeInterval:5*60 target:self selector:@selector(printNum) userInfo:nil repeats:YES];
      [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSDefaultRunLoopMode];

    方法二:
    self.timer = [NSTimer scheduledTimerWithTimeInterval:5*60 target:self selector:@selector(printNum) userInfo:nil repeats:YES]; //初始化一个5分钟执行一次的计时器

      NSTimer初始化方法一,里面没有scheduled,所以必须要手动addTimer:,将timer添加到runloop中;方法二中有scheduled的初始化方法,将以默认的mode把timer添加到当前的runloop中。

        二、计时器触发操作
        当定时器创建完(不用scheduled的)添加到runloop中后,该定时器将在初始化时指定的timeInterval秒后自动触发,可以使用-(void)fire;方法来立即触发该定时器。
       在重复执行的定时器中调用这个方法后会立即触发该定时器,但不会中断其之前的执行计划。在不重复执行的定时器中调用此方法,立即触发后,就会使这个定时器失效。

         三、计时器停止操作
         NSTimer的停止操作只有一种方法可以将timer移除runloop,具体操作如下所示:
         [self.timer invalidate]; //停止计时器的方法
         self.timer = nil;   //为了防止意外,还是要把它赋值为nil的

       由于计时器NSTimer会保留目标对象,等到它自身失效时再释放这个对象。调用invalidate方法可令计时器失效;执行完相关任务后,一次性的计时器也会失效。如果将计时器设置成重复执行的模式,那么必须要自己手动调用invalidate方法,才能令其停止。但是由于计时器会保留它的目标对象,所以反复执行任务会导致程序出问题,也就是说设置成重复执行模式的那种计时器,容易形成“引用循环”,因此在这种情况下,一定要记得调用终止计时器的invalidate方法才行。

    四、使用计时器需要注意的地方
    1、倒计时的时间间隔(时间单位是秒,可以精确到50-100毫秒);
    2、指定的执行方法;
    3、实现指定执行方法的对象;
    4、是否重复执行;
    5、使用方法" invalidate "进行停止;
    6、将对象设置为" nil “;
    7、特别是在返回到其他视图控制器的时候,要在" - (void)viewWillDisappear:
     (BOOL)animated "方法中(特别注意:不能在" - (void)dealloc”方法中设置)将timer停止,并设置为nil。


    以上就是本节的全部内容,欢迎关注三掌柜的微信公众号,欢迎关注!
                                                       

猜你喜欢

转载自blog.csdn.net/cc1991_/article/details/81070986