NSTimer 官方文档

2017-12-12  本文已影响6人  RYANIM

Timer 是在某一时间后触发, 并发送给目标特定消息.

Timer 和 run loop 同时工作,并且 timer 被设置给 runloop 之后会被 run loop 强引用, 所以不用额外去维护 timer 的强引用.

Threading Programming Guide

Timer 不是一个实时的机制,如果一个 timer 的触发事件是在 run loop 的长调出或者 run loop 处于一个没有监听 timer 的 mode 的时候, 那么 timer 就不会触发, 直到 run loop 下次检查 timer. 因此, timer 的触发时间会明显地延迟.

非重复的 timer 就执行一次,然后自动地把自己设为无效, 由此防止 timer 再次触发. 相反地, 重复的 timer 会触发,然后重新把自己设置在当前的 run loop 上.重复的 timer 的触发时间总是按照原始计划的时间, 而不是实际触发的时间.举个例子, 如果某 timer 被设定在某个时间触发, 并且每隔 5s 就触发一次, 那么这个 timer 的触发事件总是在指定时间的 5 秒间隔, 就算中间某次触发延迟了也是一样. 如果 timer 延迟了好几次触发的时间, 那么只会触发一次,在触发后再次设置下个触发时间.

如果 timer 已经安排在 run loop 上, timer 会一直在指定的时间间距上执行, 直到失效.非重复的 timer 在触发之后径直失效, 但是 重复的 timer 必须要调用 invalid() method 来试它失效.调用这个方法是要 timer 从当前的 run loop 移除, 所以就不得不在 timer 安装的 run loop 上调用方法去移除. timer 直接失效, 不再影响 run loop. Run loop 直接移除 timer(还有run loop 持有的 timer 的强引用), 恰好就在 invalid: 调用的时候.

可重复的 timer 触发后, 它会把下一次触发时间设置在最近的整数倍时间间隔外加公差时间. 如果触发后调用执行时间比时间间隔长, 那么下一次触发时间就找在执行完时间后的离原始时间最近整数倍时间间隔, 执行时间不会有影响.

上一篇 下一篇

猜你喜欢

热点阅读