美文网首页
关于dispatch_source_t创建计时器

关于dispatch_source_t创建计时器

作者: Hww_123 | 来源:发表于2019-12-31 17:34 被阅读0次

    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出现的。

    相关文章

      网友评论

          本文标题:关于dispatch_source_t创建计时器

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