RunLoop学习小记
先描述一个场景,scrollView上有一个定时器,但是每当我们滑动scrollView时,定时器就不走了,这可能使得倒计时的时间不准,原因是什么呢?怎么解决呢?这就用到了RunLoop的知识了。
当我们创建一个定时器,并且加入到RunLoop中,我们会有如下代码:
NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 repeats:YES block:^(NSTimer * _Nonnull timer) {
NSLog(@"创建一个定时器");
}];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
这样,我们就创建了一个定时器,并且每一秒打印一下。但是,如果这个我们此时拖动在同一个界面的scrollView时,我们会发现,在我们拖动的时候定时器不动了,不拖动的时候,定时器又恢复了正常,问题在哪呢?
原来是NSDefaultRunLoopMode这个参数!
于是我们换成了UITrackingRunLoopMode,我们却惊喜的发现,当我们滑动的时候打印,不滑动的时候却不打印了。
NSDefaultRunLoopMode(默认模式)
UITrackingRunLoopMode (UI模式)
当我们把这两种mode都加上,结果正如我们所料,打印正常了。
有没有一个mode就能完成这两种模式的效果呢?
答案是有的!
当mode为NSRunLoopCommonModes时,就完成了刚才的操作。相当于两种mode都添加上了,滑动scrollView就不会影响倒计时了。