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

首頁 > 系統 > iOS > 正文

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

2020-02-19 15:45:33
字體:
來源:轉載
供稿:網友

Dispatch Source Timer是與Dispatch Queue一起使用的計時器,當我們使用調度源計時器比使用nstimer更自然、更高效,下面武林技術頻道小編將給大家帶來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}

以上就是有關Dispatch Source Timer的使用及注意事項介紹,武林技術頻道發布的知識還是很靠譜的,可以幫助我們找到適合自己的操作。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 越西县| 新巴尔虎左旗| 宝应县| 吴江市| 普定县| 菏泽市| 清新县| 东方市| 通榆县| 南康市| 平度市| 雷山县| 都昌县| 耿马| 方正县| 六盘水市| 白山市| 乌拉特前旗| 广河县| 油尖旺区| 太保市| 高台县| 伊金霍洛旗| 灵川县| 博湖县| 资溪县| 鄱阳县| 易门县| 腾冲县| 嵊泗县| 台安县| 永登县| 延吉市| 瑞金市| 甘孜| 沙雅县| 瓮安县| 榆树市| 略阳县| 丹棱县| 靖宇县|