ios中DispatchSourceTimer怎么用

小編給大家分享一下ios中Dispatch Source Timer怎么用,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

臨清ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!

創(chuàng)建 Timer

Dispatch Source Timer 首先其實是 Dispatch Source 的一種,關(guān)于 Dispatch Source 的內(nèi)容在這里就不再贅述了。下面是蘋果官方文檔里給出的創(chuàng)建 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 是間隔定時器,也就是說每隔一段時間間隔定時器就會觸發(fā)。在 NSTimer 中要做到同樣的效果需要手動把 repeats 設(shè)置為 YES。

  2. dispatch_source_set_timer 中第二個參數(shù),當我們使用dispatch_time 或者 DISPATCH_TIME_NOW 時,系統(tǒng)會使用默認時鐘來進行計時。然而當系統(tǒng)休眠的時候,默認時鐘是不走的,也就會導致計時器停止。使用 dispatch_walltime 可以讓計時器按照真實時間間隔進行計時。

  3. dispatch_source_set_timer 的第四個參數(shù) leeway 指的是一個期望的容忍時間,將它設(shè)置為 1 秒,意味著系統(tǒng)有可能在定時器時間到達的前 1 秒或者后 1 秒才真正觸發(fā)定時器。在調(diào)用時推薦設(shè)置一個合理的 leeway 值。需要注意,就算指定 leeway 值為 0,系統(tǒng)也無法保證完全精確的觸發(fā)時間,只是會盡可能滿足這個需求。

  4. event handler block 中的代碼會在指定的 queue 中執(zhí)行。當 queue 是后臺線程的時候,dispatch timer 相比 NSTimer 就好操作一些了。因為 NSTimer 是需要 Runloop 支持的,如果要在后臺 dispatch queue 中使用,則需要手動添加 Runloop。使用 dispatch timer 就簡單很多了。

  5. dispatch_source_set_event_handler 這個函數(shù)在執(zhí)行完之后,block 會立馬執(zhí)行一遍,后面隔一定時間間隔再執(zhí)行一次。而 NSTimer 第一次執(zhí)行是到計時器觸發(fā)之后。這也是和 NSTimer 之間的一個顯著區(qū)別。

停止 Timer

停止 Dispatch Timer 有兩種方法,一種是使用 dispatch_suspend,另外一種是使用 dispatch_source_cancel。

dispatch_suspend 嚴格上只是把 Timer 暫時掛起,它和 dispatch_resume 是一個平衡調(diào)用,兩者分別會減少和增加 dispatch 對象的掛起計數(shù)。當這個計數(shù)大于 0 的時候,Timer 就會執(zhí)行。在掛起期間,產(chǎn)生的事件會積累起來,等到 resume 的時候會融合為一個事件發(fā)送。

需要注意的是:dispatch source 并沒有提供用于檢測 source 本身的掛起計數(shù)的 API,也就是說外部不能得知一個 source 當前是不是掛起狀態(tài),在設(shè)計代碼邏輯時需要考慮到這一點。

dispatch_source_cancel 則是真正意義上的取消 Timer。被取消之后如果想再次執(zhí)行 Timer,只能重新創(chuàng)建新的 Timer。這個過程類似于對 NSTimer 執(zhí)行 invalidate。

關(guān)于取消 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怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

本文標題:ios中DispatchSourceTimer怎么用
文章路徑:http://muchs.cn/article18/jpiedp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、網(wǎng)站設(shè)計公司、網(wǎng)站設(shè)計云服務器、網(wǎng)站導航、面包屑導航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)