美文网首页
iOS精准计时器

iOS精准计时器

作者: 再好一点点 | 来源:发表于2019-03-11 09:47 被阅读0次
    timg.jpeg

    NSTimer受runloop的影响,由于runloop需要处理很多任务,导致NSTimer的精度降低, 尤其是添加在主线程的NSTimer在滑动scrollview的时候如果处理不好会导致计时暂停,所以在日常开发中,如果我们需要对定时器的精度要求很高的话,可以考虑dispatch_source_t去实现 。dispatch_source_t精度很高,系统自动触发,系统级别的源。下面是通过dispatch_source_t 创建 计时器的例子

    - (void)viewDidLoad {
        [super viewDidLoad];
        
        dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(0, 0));
        
        //开始时间
        dispatch_time_t start = dispatch_time(DISPATCH_TIME_NOW, 3.0 * NSEC_PER_SEC);
        /** 设置定时器
         * para2: 任务开始时间
         * para3: 任务的间隔
         * para4: 可接受的误差时间,设置0即不允许出现误差
         * Tips: 单位均为纳秒
         */
        dispatch_source_set_timer(timer, start, 1.0 * NSEC_PER_SEC, 0.0 * NSEC_PER_SEC);
        /** 设置定时器任务
         * 可以通过block方式
         * 也可以通过C函数方式
         */
        dispatch_source_set_event_handler(timer, ^{
            static int index = 0;
            NSLog(@"index: %d", index++);
            NSLog(@"%@", [NSThread currentThread]);
    
            if(index == 5) {
                //终止定时器(如果没有终止方法,则定时器不会启动)
                dispatch_suspend(timer);
            }
        });
        //启动任务,GCD计时器创建后需要手动启动
        dispatch_resume(timer);
        
    }
    

    相关文章

      网友评论

          本文标题:iOS精准计时器

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