美文网首页
CCD比NSTimer相对准时的原因

CCD比NSTimer相对准时的原因

作者: heart_领 | 来源:发表于2018-09-17 13:52 被阅读9次

    一、NSTimer不准时的原因,主要有两个:
    1.Runloop循环处理的时间
    2.受Runloop模式的影响
    二、GCDTimer
    1.GCDTimer精度高
    2.GCDTimer主线程执行会RunLoop影响,子线程不受影响
    3.GCDTimer不受模式切换的影响

    - (void) gcdTimerTest {
        
        // 队列
        dispatch_queue_t queue = dispatch_get_main_queue();//在主队列上会受runloop的影响,主线程上
    //    dispatch_queue_t queue = dispatch_queue_create("timer_serial_label", DISPATCH_QUEUE_SERIAL);//非主队列上不受runloop影响,子线程上
        // 创建定时器
        dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
        
        // 设置定时的开始时间、间隔时间,dispatch_time(DISPATCH_TIME_NOW, 0):开始时间,立即开合,0改为2,则2秒后开始
        dispatch_source_set_timer(timer, dispatch_time(DISPATCH_TIME_NOW, 0), 1*NSEC_PER_SEC, 0);
        
        // 设置定时器回调
        dispatch_source_set_event_handler(timer, ^{
            NSLog(@"你好%@",[NSThread currentThread]);
        });
        // 启动定时器,默认是关闭的
        dispatch_resume(timer);
        self.timer = timer;
    //    dispatch_cancel(self.timer);//定时器停止
    //    self.timer = nil; //因为是强引用,要置空
    /**
    dispatch_resume(self.timer);//执行的情况下,返回时会走dealloc方法
    dispatch_suspend(self.timer);//挂起的情况下,返回时会崩溃
    NSTimer不能暂停,只能销毁,timer可以通过dispatch_suspend(self.timer)暂停定时器
    dispatch_cancel(self.timer);//定时器停止时,返回不会崩溃
    */
    }
    

    三、GCD timer与NSTimer是不同的:
    1.二者都是源,一个是RunLoop的源,一个Dispatch的源
    2.GCD timer不需要加入mode

    相关文章

      网友评论

          本文标题:CCD比NSTimer相对准时的原因

          本文链接:https://www.haomeiwen.com/subject/whvknftx.html