关于dispatch_source_t创建计时器

dispatch_source_t 的优点:

1、dispatch_source_t 不再需要和NSTimer一样创建完毕后需要添加到runloop ,样式如下:[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

2、在添加scrollView滚动的时候也不会印象计时器。

3、在切换到后台后,切入前台的时候timer不再累加,也就是timer会跑快。

4、但是了在使用的时候一定要注意,如果用局部的 dispatch_source_t 对象去接收的话,我们这个时候肯定计时器的跑步起来的,因为系统不会持有你当前的 dispatch_source_t 的对象,及时 dispatch_resume 执行也不会。当我们 lldb 打印 source 的时候发现这个的 isa 是OS_dispatch_source,我们知道关于OS开头的都是系统自己调度的。所以这个一定注意,这个时候为了解决这个问题,需要你自己全局去持有当前的 dispatch_source_t对象。写一个属性或者 成员变量都可以

5、NSTimer 创建的 timer 会出现不能释放的问题存在,当时 dispatch_source_t 不会,猜测 dispatch_source_t 这种知识 runloop 下面添加的资源,在执行完毕后自动清除,而 NSTimer 则遵守面向对象的常用对象管理,当然里面会持有当前的 NSTimer 创建的这个对象,所以在退出的时候需要手动清理。

6、下面是 dispatch_source_t 常用的代码例子:

 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);

    dispatch_source_set_timer(_timer,DISPATCH_WALLTIME_NOW,1.0*NSEC_PER_SEC, 0); //每秒执行

    static NSInteger i=0;

    dispatch_source_set_event_handler(_timer, ^{

        i++;

        NSLog(@"========== %ld",(long)i);

    });

    dispatch_resume(_timer);

7、dispatch_time_t 和 DISPATCH_WALLTIME_NOW 是一样的,看你怎么创建了,如果你的机型适配了iOS 12下面的机型,建议使用 dispatch_time_t,DISPATCH_WALLTIME_NOW 这个是iOS12出现的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。