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