前言
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;}
有幾個地方需要注意:
停止 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}
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。
新聞熱點
疑難解答