iOS知识点程序员

iOS GCD定时器

2018-04-19  本文已影响545人  userName

定时器需求

先说需求我们需要一个定时器,包含开启,暂停,恢复,关闭。线程安全
并且不需要管理他的内存,无论在什么状态只要持有他的self释放了,这个定时器也要跟着释放。

约定

当定时器 开启后 只可以 暂停 和 关闭
当定时器 关闭后 只可以 重新开启
当定时器 暂停后 只可以 恢复
当定时器 恢复后 只可以 暂停 和 关闭

注意事项

1. dispatch_source_set_event_handler 回调是一个block,所以很容易会出现循环引用问题。

使用的时候记得加__weak

2.关于dispatch_suspend与dispatch_resume

dispatch_suspend 是将定时器暂停,dispatch_resume是恢复定时器。

官方注释
Calls to dispatch_suspend() must be balanced with calls
to dispatch_resume().

你调用了suspend(暂停)几次,你想resume(恢复)的话,就必须要remuse(恢复)几次,才能继续运行。
但remuse(恢复)的状态下,如果再进行一次resume(恢复)就会crash,所以要注册一个BOOL值的状态进行记录,防止多次suspend和resume引起闪退。
并且在suspend(暂停)的状态下,如果你设置_timer = nil就会crash

自己写的DEMO:https://github.com/YBYHunter/YUTimer

上一篇下一篇

猜你喜欢

热点阅读