定时器NSTimer还是使用dispatch_after?

最近在做的项目里使用了不少的定时器,一开始我是使用GCD 的,后来需求改了,GCD 的时间方法了解并不多,满足不了需求。只好修改成 NSTimer ;

  • NSTimer 的话,最主要的是内存释放问题,大家都知道这样就可以释放定时器了,项目证明是不对的:

     [timer invalidate];
     timer = nil;
    
  • 看看这个博客对你有帮助呢.
    http://blog.csdn.net/yohunl/article/details/50614903

  • 然后,找到了一个较好的资源吧!大家可以相互学习一下:

定时器--- 比较符合我的胃口

GCD 的话 使用时间 的函数,个人了解的并不多。希望读者多多提供资料,互相学习。

   dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{}

推荐去看看 ==GCD 官方文档

上面的大家都经常使用:下面推荐一些好用的函数给大家:

//得到dispatch源创建,即调用dispatch_source_create的第二个参数    
uintptr_t dispatch_source_get_handle(dispatch_source_t source);  
//得到dispatch源创建,即调用dispatch_source_create的第三个参数   unsignedlong dispatch_source_get_mask(dispatch_source_t source);     

//取消dispatch源的事件处理--即不再调用block。如果调用
void dispatch_source_cancel(dispatch_source_t source);
dispatch_suspend只是暂停dispatch源。

 //检测是否dispatch源被取消,如果返回非0值则表明dispatch源已经被取消
long dispatch_source_testcancel(dispatch_source_t source);
  
//dispatch源取消时调用的block,一般用于关闭文件或socket等,释放相关资源      
void dispatch_source_set_cancel_handler(dispatch_source_t source, dispatch_block_t cancel_handler);

 //可用于设置dispatch源启动时调用block,调用完成后即释放这个block。也可在dispatch源运行当中随时调用这个函数。
void dispatch_source_set_registration_handler(dispatch_source_t source, dispatch_block_t registration_handler);
  • 欢迎大家提供参考博文资料,谢谢大家!

这个时GCD 的timer 写法:

  __weak typeof(self)weakSelf = self;

 //1、 拿到一个队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//2、创建timer 放到队列里面
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
//3、设置timer执行的时间、执行时间间隔、精确度
dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 1.0*NSEC_PER_SEC, 0.1 * NSEC_PER_SEC);
//4、设置timer执行的事件
dispatch_source_set_event_handler(timer, ^{
    [weakSelf doSomething];
});
//5、激活timer
dispatch_resume(timer);
//6、取消timer
dispatch_source_cancel(timer);

你可能感兴趣的:(定时器NSTimer还是使用dispatch_after?)