国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > iOS > 正文

Dispatch Source Timer的使用及注意事項介紹

2020-07-26 02:41:48
字體:
來源:轉載
供稿:網友

前言

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;}

有幾個地方需要注意:

  1. Dispatch Source Timer 是間隔定時器,也就是說每隔一段時間間隔定時器就會觸發。在 NSTimer 中要做到同樣的效果需要手動把 repeats 設置為 YES。
  2. dispatch_source_set_timer 中第二個參數,當我們使用dispatch_time 或者 DISPATCH_TIME_NOW 時,系統會使用默認時鐘來進行計時。然而當系統休眠的時候,默認時鐘是不走的,也就會導致計時器停止。使用 dispatch_walltime 可以讓計時器按照真實時間間隔進行計時。
  3. dispatch_source_set_timer 的第四個參數 leeway 指的是一個期望的容忍時間,將它設置為 1 秒,意味著系統有可能在定時器時間到達的前 1 秒或者后 1 秒才真正觸發定時器。在調用時推薦設置一個合理的 leeway 值。需要注意,就算指定 leeway 值為 0,系統也無法保證完全精確的觸發時間,只是會盡可能滿足這個需求。
  4. event handler block 中的代碼會在指定的 queue 中執行。當 queue 是后臺線程的時候,dispatch timer 相比 NSTimer 就好操作一些了。因為 NSTimer 是需要 Runloop 支持的,如果要在后臺 dispatch queue 中使用,則需要手動添加 Runloop。使用 dispatch timer 就簡單很多了。
  5. 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}

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 乐陵市| 马关县| 石狮市| 德令哈市| 海口市| 武功县| 加查县| 睢宁县| 定结县| 叶城县| 松溪县| 九江市| 古蔺县| 五指山市| 治县。| 蓝田县| 边坝县| 达日县| 湟源县| 五河县| 景谷| 黄石市| 门源| 城步| 固阳县| 喀喇| 施甸县| 胶南市| 开平市| 仙居县| 金山区| 林口县| 常熟市| 油尖旺区| 玛纳斯县| 沅江市| 宝山区| 清新县| 衡山县| 胶州市| 瓦房店市|