您好,登錄后才能下訂單哦!
小編給大家分享一下ios中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; }
有幾個地方需要注意:
Dispatch Source Timer 是間隔定時器,也就是說每隔一段時間間隔定時器就會觸發。在 NSTimer 中要做到同樣的效果需要手動把 repeats 設置為 YES。
dispatch_source_set_timer 中第二個參數,當我們使用dispatch_time 或者 DISPATCH_TIME_NOW 時,系統會使用默認時鐘來進行計時。然而當系統休眠的時候,默認時鐘是不走的,也就會導致計時器停止。使用 dispatch_walltime 可以讓計時器按照真實時間間隔進行計時。
dispatch_source_set_timer 的第四個參數 leeway 指的是一個期望的容忍時間,將它設置為 1 秒,意味著系統有可能在定時器時間到達的前 1 秒或者后 1 秒才真正觸發定時器。在調用時推薦設置一個合理的 leeway 值。需要注意,就算指定 leeway 值為 0,系統也無法保證完全精確的觸發時間,只是會盡可能滿足這個需求。
event handler block 中的代碼會在指定的 queue 中執行。當 queue 是后臺線程的時候,dispatch timer 相比 NSTimer 就好操作一些了。因為 NSTimer 是需要 Runloop 支持的,如果要在后臺 dispatch queue 中使用,則需要手動添加 Runloop。使用 dispatch timer 就簡單很多了。
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中Dispatch Source Timer怎么用”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。