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