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

 更新时间:2017年09月12日 14:10:37   作者:Skyline75489  
这篇文章主要给大家介绍了关于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
}

总结

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

相关文章

  • iOS实现简单的二级菜单效果

    iOS实现简单的二级菜单效果

    这篇文章给大家主要介绍的是利用iOS如何实现简单的菜单效果,文中给出了详细的示例代码,而且实现的比较简单,适合新人学习使用。感兴趣的朋友们可以参考借鉴,下面来一起看看吧。
    2016-10-10
  • 详解iOS App中图片的线段涂鸦功能的添加方法

    详解iOS App中图片的线段涂鸦功能的添加方法

    这篇文章主要介绍了如何设计iOS App中图片的线段涂鸦功能,也就是很多应用中图片上传时带有的编辑功能的基础,需要的朋友可以参考下
    2016-03-03
  • IOS开发中的设计模式汇总

    IOS开发中的设计模式汇总

    在ios的程序开发中,经常搞晕ios的开发模式,今天小编就给大家简单的总结一下,需要的的朋友参考下
    2017-03-03
  • iOS实现无感知上拉加载更多功能的思路与方法

    iOS实现无感知上拉加载更多功能的思路与方法

    下拉刷新和上拉加载更多功能是一个应用非常广泛的一个效果,最新项目中就遇到这个功能,这篇文章主要给大家介绍了关于iOS实现无感知上拉加载更多功能的思路与方法,需要的朋友可以参考下
    2021-07-07
  • IOS 开发之 UITextField限制字数的方法

    IOS 开发之 UITextField限制字数的方法

    这篇文章主要介绍了IOS 开发之 UITextField限制字数的方法的相关资料,这里提供实现限制最大字数的方法,需要的朋友可以参考下
    2017-08-08
  • iOS实现不规则Button点击效果实例代码

    iOS实现不规则Button点击效果实例代码

    这篇文章主要给大家介绍了关于iOS实现不规则Button点击的相关资料,文中通过示例代码介绍的非常详细,对各位iOS开发者们具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • ios 不支持 iframe 的完美解决方法(兼容iOS&安卓)

    ios 不支持 iframe 的完美解决方法(兼容iOS&安卓)

    下面小编就为大家带来一篇ios 不支持 iframe 的完美解决方法(兼容iOS&安卓)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • iOS中UITableview错位的问题怎么修复

    iOS中UITableview错位的问题怎么修复

    这篇文章主要介绍了iOS中UITableview错位的问题以及修复方法,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-01-01
  • MacOS系统下Unity启动黑屏的解决方法

    MacOS系统下Unity启动黑屏的解决方法

    最近发现了一个问题,unity一打开就黑屏,通过查找相关的资料终于解决了,所以下面这篇文章主要给大家介绍了关于在MacOS系统下Unity启动黑屏的解决方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。
    2018-01-01
  • IOS 中CALayer绘制图片的实例详解

    IOS 中CALayer绘制图片的实例详解

    这篇文章主要介绍了IOS 中CALayer绘制图片的实例详解的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-10-10

最新评论