原因
1、NSTimer被添加在mainRunLoop中,模式是NSDefaultRunLoopMode,mainRunLoop负责所有主线程事件,例如UI界面的操作,复杂的运算,这样就会造成timer的阻塞、
2、模式的切换,当创建的timer被加入到NSDefaultRunLoopMode时,此时如果有滑动UIScrollView的操作,runLoop 的mode会切换为TrackingRunLoopMode,这是timer会停止回调。
解决
方法一
1、在子线程中创建timer,在主线程进行定时任务的操作
2、在子线程中创建timer,在子线程中进行定时任务的操作,需要UI操作时切换回主线程进行操作
方法二
使用GCD定时器
/**
参数1:代表创建一个定时器
参数4:队列
这里的强引用是因为,当我定时器延时几秒调用的时候,局部变量就销毁了,我们需要强引用起来
*/
self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(0, 0));
/**
设置定时器
参数1:定时器对象
参数2:GCD dispatch_time_t 里面的都是纳秒 创建一个距离现在多少秒开启的任务
参数3:间隔多少秒调用一次
*/
dispatch_source_set_timer(self.timer, dispatch_time(DISPATCH_TIME_NOW, 1.0), 1.0 * NSEC_PER_SEC, 0); // 设置回调
dispatch_source_set_event_handler(self.timer, ^{
NSLog(@"doSomething");
});
// 启动
dispatch_resume(self.timer);