NSTimer不准的问题及解决

原因

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);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值