全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Dispatch Source Timer的使用及注意事项介绍

前言

Dispatch Source Timer 是一种与 Dispatch Queue 结合使用的定时器。当需要在后台 queue 中定期执行任务的时候,使用 Dispatch Source Timer 要比使用 NSTimer 更加自然,也更加高效(无需在 main queue 和后台 queue 之前切换)。下面将详细给大家介绍关于Dispatch Source Timer的使用和一些注意事项,话不多说了,来一起看看详细的介绍吧。

创建 Timer

Dispatch Source Timer 首先其实是 Dispatch Source 的一种,关于 Dispatch Source 的内容在这里就不再赘述了。下面是苹果官方文档里给出的创建 Dispatch Timer 的代码:

dispatch_source_t CreateDispatchTimer(uint64_t interval,
  uint64_t leeway,
  dispatch_queue_t queue,
  dispatch_block_t block)
{
 dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER,
       0, 0, queue);
 if (timer)
 {
 dispatch_source_set_timer(timer, dispatch_walltime(NULL, 0), interval, leeway);
 dispatch_source_set_event_handler(timer, block);
 dispatch_resume(timer);
 }
 return timer;
}

有几个地方需要注意:

  1. Dispatch Source Timer 是间隔定时器,也就是说每隔一段时间间隔定时器就会触发。在 NSTimer 中要做到同样的效果需要手动把 repeats 设置为 YES。
  2. dispatch_source_set_timer 中第二个参数,当我们使用dispatch_time 或者 DISPATCH_TIME_NOW 时,系统会使用默认时钟来进行计时。然而当系统休眠的时候,默认时钟是不走的,也就会导致计时器停止。使用 dispatch_walltime 可以让计时器按照真实时间间隔进行计时。
  3. dispatch_source_set_timer 的第四个参数 leeway 指的是一个期望的容忍时间,将它设置为 1 秒,意味着系统有可能在定时器时间到达的前 1 秒或者后 1 秒才真正触发定时器。在调用时推荐设置一个合理的 leeway 值。需要注意,就算指定 leeway 值为 0,系统也无法保证完全精确的触发时间,只是会尽可能满足这个需求。
  4. event handler block 中的代码会在指定的 queue 中执行。当 queue 是后台线程的时候,dispatch timer 相比 NSTimer 就好操作一些了。因为 NSTimer 是需要 Runloop 支持的,如果要在后台 dispatch queue 中使用,则需要手动添加 Runloop。使用 dispatch timer 就简单很多了。
  5. dispatch_source_set_event_handler 这个函数在执行完之后,block 会立马执行一遍,后面隔一定时间间隔再执行一次。而 NSTimer 第一次执行是到计时器触发之后。这也是和 NSTimer 之间的一个显著区别。

停止 Timer

停止 Dispatch Timer 有两种方法,一种是使用 dispatch_suspend,另外一种是使用 dispatch_source_cancel。

dispatch_suspend 严格上只是把 Timer 暂时挂起,它和 dispatch_resume 是一个平衡调用,两者分别会减少和增加 dispatch 对象的挂起计数。当这个计数大于 0 的时候,Timer 就会执行。在挂起期间,产生的事件会积累起来,等到 resume 的时候会融合为一个事件发送。

需要注意的是:dispatch source 并没有提供用于检测 source 本身的挂起计数的 API,也就是说外部不能得知一个 source 当前是不是挂起状态,在设计代码逻辑时需要考虑到这一点。

dispatch_source_cancel 则是真正意义上的取消 Timer。被取消之后如果想再次执行 Timer,只能重新创建新的 Timer。这个过程类似于对 NSTimer 执行 invalidate。

关于取消 Timer,另外一个很重要的注意事项:dispatch_suspend 之后的 Timer,是不能被释放的!下面的代码会引起崩溃:

- (void)stopTimer
{
 dispatch_suspend(_timer);
 _timer = nil; // EXC_BAD_INSTRUCTION 崩溃
}

因此使用 dispatch_suspend 时,Timer 本身的实例需要一直保持。使用 dispatch_source_cancel 则没有这个限制:

- (void)stopTimer
{
 dispatch_source_cancel(_timer);
 _timer = nil; // OK
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。


# dispatchsourcetimer  # ios  # dispatch  # source  # timer  # 就会  # 挂起  # 计时器  # 需要注意  # 设置为  # 的是  # 是一个  # 也就是说  # 在这里  # 是一种  # 有可能  # 说了  # 则是  # 就好  # 不多  # 会在  # 有一定  # 要在  # 一遍  # 第二个 


相关文章: 存储型VPS适合搭建中小型网站吗?  免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?  简历在线制作网站免费版,如何创建个人简历?  如何快速选择适合个人网站的云服务器配置?  黑客如何利用漏洞与弱口令入侵网站服务器?  如何在阿里云通过域名搭建网站?  建站中国官网:模板定制+SEO优化+建站流程一站式指南  临沂网站制作企业,临沂第三中学官方网站?  制作门户网站的参考文献在哪,小说网站怎么建立?  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  如何在Windows环境下新建FTP站点并设置权限?  C#怎么创建控制台应用 C# Console App项目创建方法  建站之星导航如何优化提升用户体验?  网页设计网站制作软件,microsoft office哪个可以创建网页?  免费制作小说封面的网站有哪些,怎么接网站批量的封面单?  台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?  如何快速登录WAP自助建站平台?  实例解析angularjs的filter过滤器  建站三合一如何选?哪家性价比更高?  SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?  怀化网站制作公司,怀化新生儿上户网上办理流程?  如何访问已购建站主机并解决登录问题?  已有域名如何免费搭建网站?  建站主机助手选型指南:2025年热门推荐与高效部署技巧  建站之星备案是否影响网站上线时间?  上海网站制作网站建设公司,建筑电工证网上查询系统入口?  专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?  定制建站是什么?如何实现个性化需求?  孙琪峥织梦建站教程如何优化数据库安全?  高防服务器租用如何选择配置与防御等级?  深圳网站制作培训,深圳哪些招聘网站比较好?  网站制作难吗安全吗,做一个网站需要多久时间?  如何彻底删除建站之星生成的Banner?  保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?  较简单的网站制作软件有哪些,手机版网页制作用什么软件?  如何获取开源自助建站系统免费下载链接?  网站制作新手教程,新手建设一个网站需要注意些什么?  如何用VPS主机快速搭建个人网站?  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  制作公司内部网站有哪些,内网如何建网站?  太原网站制作公司有哪些,网约车营运证查询官网?  如何用PHP快速搭建CMS系统?  建站之星会员如何解锁更多建站功能?  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  建站之星客服服务时间及联系方式如何?  如何在Golang中处理模块冲突_解决依赖版本不兼容问题  微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  Android自定义listview布局实现上拉加载下拉刷新功能  如何快速搭建高效WAP手机网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。