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