iOS精准计时器

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]);
    });
    //启动任务,GCD计时器创建后需要手动启动
    dispatch_resume(timer);
    
}

需要停止的时候调用

   1.
    dispatch_source_cancel(timer);
    timer = nil;

   2.
    dispatch_suspend(timer);

推荐使用第一种方式。第二种方式会直接停止计时器并且timer自动置为nil,但是这个时候可能还会有计时器任务未完成仍在执行,导致不可预料问题。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容