iOS开发之NSTimer使用初探

这个周日,我的大学同学结婚。他们的婚礼选在郑州举办。

他不是郑州的,他女朋友也不是郑州的。可是他们是在郑州相识相爱,终于走到一起的。所以他们选择在郑州举办婚礼。

这几年大家都在各自忙碌着。非常少有见面的机会。

只是常常会电话联系,相互了解一下情况。

作为兄弟,我打心底为他们高兴,为他们祝福。我也会到现场參加,预计如今我已经坐上开发郑州的动车了。

我喜欢走出去的感觉,非常喜欢坐车,去各个地方,哪怕是路过。感觉走的越远。离心越近。辞职去旅行或许非常快就能够实现。

近期我在改一个bug。在一个UIViewController上有一个定时器。在运行轮播图片。push到别的UIViewController的时候,暂停定时器(NSTimer);pop回来的时候。开启定时器(NSTimer)。这个bug是:push到别的UIViewController暂定定时器(NSTimer),有时候有作用,有时候没有作用。

開始我以为是NSTimer执行的run loop有问题,最后发现是别的地方导致这个bug的。只是正好,我们来一起了解一下NSTimer。

创建一个定时器(NSTimer)

- (void)viewDidLoad {
    [super viewDidLoad];
    [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(actionTimer:) userInfo:nil repeats:YES];
}

- (void)actionTimer:(NSTimer *)timer
{

}

NSTimer默认执行在default mode下。default mode差点儿包含全部输入源(除NSConnection) NSDefaultRunLoopMode模式。

actionTimer方法会每隔1s中被调用一次。NSTimer使用起来是不是很easy。

这是NSTimer比較0基础的应用。

当主界面被滑动时NSTimer失效了

主界面被滑动是什么意思呢?就是说主界面有UITableView或者UIScrollView。滑动UITableView或者UIScrollView。这个时候NSTimer失效了。

我们来写一个demo。在一个有UITableView的UIViewController上启动定时器,每1s数字加1。并将这个数字显示在UILabel上面.

- (void)viewDidLoad {
    [super viewDidLoad];
    [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(actionTimer:) userInfo:nil repeats:YES];
}

- (void)actionTimer:(NSTimer *)timer
{
    self.number++;
    self.label.text = [NSString stringWithFormat:@"%d",self.number];
    NSLog(@"%d",self.number);
}

关于UITableView和UILabel的创建我省去了。

具体的代码能够点击这里下载:iOSStrongDemo,iOSStrongDemo我会不断更新,大家在github上star一下。

这样当用户在拖动UITableView处于UITrackingRunLoopMode时,NSTimer就失效了。不能fire。self.label上的数字也就无法更新。

nstimer1

改动NSTimer的run loop

解决方法就是将其增加到UITrackingRunLoopMode模式或NSRunLoopCommonModes模式中。

[[NSRunLoop currentRunLoop] addTimer:timer forMode:UITrackingRunLoopMode];

或者

[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

NSRunLoopCommonModes:是一个模式集合。当绑定一个事件源到这个模式集合的时候就相当于绑定到了集合内的每个模式。

nstimer1

代码下载地址::iOSStrongDemo

原文地址:https://www.cnblogs.com/jzssuanfa/p/7282018.html