欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Dispatch Source Timer的使用及注意事項(xiàng)介紹

 更新時(shí)間:2017年09月12日 14:10:37   作者:Skyline75489  
這篇文章主要給大家介紹了關(guān)于Dispatch Source Timer使用和一些注意事項(xiàng)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)下吧。

前言

Dispatch Source Timer 是一種與 Dispatch Queue 結(jié)合使用的定時(shí)器。當(dāng)需要在后臺(tái) queue 中定期執(zhí)行任務(wù)的時(shí)候,使用 Dispatch Source Timer 要比使用 NSTimer 更加自然,也更加高效(無需在 main queue 和后臺(tái) queue 之前切換)。下面將詳細(xì)給大家介紹關(guān)于Dispatch Source Timer的使用和一些注意事項(xiàng),話不多說了,來一起看看詳細(xì)的介紹吧。

創(chuàng)建 Timer

Dispatch Source Timer 首先其實(shí)是 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;
}

有幾個(gè)地方需要注意:

  1. Dispatch Source Timer 是間隔定時(shí)器,也就是說每隔一段時(shí)間間隔定時(shí)器就會(huì)觸發(fā)。在 NSTimer 中要做到同樣的效果需要手動(dòng)把 repeats 設(shè)置為 YES。
  2. dispatch_source_set_timer 中第二個(gè)參數(shù),當(dāng)我們使用dispatch_time 或者 DISPATCH_TIME_NOW 時(shí),系統(tǒng)會(huì)使用默認(rèn)時(shí)鐘來進(jìn)行計(jì)時(shí)。然而當(dāng)系統(tǒng)休眠的時(shí)候,默認(rèn)時(shí)鐘是不走的,也就會(huì)導(dǎo)致計(jì)時(shí)器停止。使用 dispatch_walltime 可以讓計(jì)時(shí)器按照真實(shí)時(shí)間間隔進(jìn)行計(jì)時(shí)。
  3. dispatch_source_set_timer 的第四個(gè)參數(shù) leeway 指的是一個(gè)期望的容忍時(shí)間,將它設(shè)置為 1 秒,意味著系統(tǒng)有可能在定時(shí)器時(shí)間到達(dá)的前 1 秒或者后 1 秒才真正觸發(fā)定時(shí)器。在調(diào)用時(shí)推薦設(shè)置一個(gè)合理的 leeway 值。需要注意,就算指定 leeway 值為 0,系統(tǒng)也無法保證完全精確的觸發(fā)時(shí)間,只是會(huì)盡可能滿足這個(gè)需求。
  4. event handler block 中的代碼會(huì)在指定的 queue 中執(zhí)行。當(dāng) queue 是后臺(tái)線程的時(shí)候,dispatch timer 相比 NSTimer 就好操作一些了。因?yàn)?NSTimer 是需要 Runloop 支持的,如果要在后臺(tái) dispatch queue 中使用,則需要手動(dòng)添加 Runloop。使用 dispatch timer 就簡(jiǎn)單很多了。
  5. dispatch_source_set_event_handler 這個(gè)函數(shù)在執(zhí)行完之后,block 會(huì)立馬執(zhí)行一遍,后面隔一定時(shí)間間隔再執(zhí)行一次。而 NSTimer 第一次執(zhí)行是到計(jì)時(shí)器觸發(fā)之后。這也是和 NSTimer 之間的一個(gè)顯著區(qū)別。

停止 Timer

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

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

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

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

關(guān)于取消 Timer,另外一個(gè)很重要的注意事項(xiàng):dispatch_suspend 之后的 Timer,是不能被釋放的!下面的代碼會(huì)引起崩潰:

- (void)stopTimer
{
 dispatch_suspend(_timer);
 _timer = nil; // EXC_BAD_INSTRUCTION 崩潰
}

因此使用 dispatch_suspend 時(shí),Timer 本身的實(shí)例需要一直保持。使用 dispatch_source_cancel 則沒有這個(gè)限制:

- (void)stopTimer
{
 dispatch_source_cancel(_timer);
 _timer = nil; // OK
}

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • iOS實(shí)現(xiàn)簡(jiǎn)單的二級(jí)菜單效果

    iOS實(shí)現(xiàn)簡(jiǎn)單的二級(jí)菜單效果

    這篇文章給大家主要介紹的是利用iOS如何實(shí)現(xiàn)簡(jiǎn)單的菜單效果,文中給出了詳細(xì)的示例代碼,而且實(shí)現(xiàn)的比較簡(jiǎn)單,適合新人學(xué)習(xí)使用。感興趣的朋友們可以參考借鑒,下面來一起看看吧。
    2016-10-10
  • 詳解iOS App中圖片的線段涂鴉功能的添加方法

    詳解iOS App中圖片的線段涂鴉功能的添加方法

    這篇文章主要介紹了如何設(shè)計(jì)iOS App中圖片的線段涂鴉功能,也就是很多應(yīng)用中圖片上傳時(shí)帶有的編輯功能的基礎(chǔ),需要的朋友可以參考下
    2016-03-03
  • IOS開發(fā)中的設(shè)計(jì)模式匯總

    IOS開發(fā)中的設(shè)計(jì)模式匯總

    在ios的程序開發(fā)中,經(jīng)常搞暈ios的開發(fā)模式,今天小編就給大家簡(jiǎn)單的總結(jié)一下,需要的的朋友參考下
    2017-03-03
  • iOS實(shí)現(xiàn)無感知上拉加載更多功能的思路與方法

    iOS實(shí)現(xiàn)無感知上拉加載更多功能的思路與方法

    下拉刷新和上拉加載更多功能是一個(gè)應(yīng)用非常廣泛的一個(gè)效果,最新項(xiàng)目中就遇到這個(gè)功能,這篇文章主要給大家介紹了關(guān)于iOS實(shí)現(xiàn)無感知上拉加載更多功能的思路與方法,需要的朋友可以參考下
    2021-07-07
  • IOS 開發(fā)之 UITextField限制字?jǐn)?shù)的方法

    IOS 開發(fā)之 UITextField限制字?jǐn)?shù)的方法

    這篇文章主要介紹了IOS 開發(fā)之 UITextField限制字?jǐn)?shù)的方法的相關(guān)資料,這里提供實(shí)現(xiàn)限制最大字?jǐn)?shù)的方法,需要的朋友可以參考下
    2017-08-08
  • iOS實(shí)現(xiàn)不規(guī)則Button點(diǎn)擊效果實(shí)例代碼

    iOS實(shí)現(xiàn)不規(guī)則Button點(diǎn)擊效果實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于iOS實(shí)現(xiàn)不規(guī)則Button點(diǎn)擊的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)各位iOS開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • ios 不支持 iframe 的完美解決方法(兼容iOS&安卓)

    ios 不支持 iframe 的完美解決方法(兼容iOS&安卓)

    下面小編就為大家?guī)硪黄猧os 不支持 iframe 的完美解決方法(兼容iOS&安卓)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-07-07
  • iOS中UITableview錯(cuò)位的問題怎么修復(fù)

    iOS中UITableview錯(cuò)位的問題怎么修復(fù)

    這篇文章主要介紹了iOS中UITableview錯(cuò)位的問題以及修復(fù)方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2017-01-01
  • MacOS系統(tǒng)下Unity啟動(dòng)黑屏的解決方法

    MacOS系統(tǒng)下Unity啟動(dòng)黑屏的解決方法

    最近發(fā)現(xiàn)了一個(gè)問題,unity一打開就黑屏,通過查找相關(guān)的資料終于解決了,所以下面這篇文章主要給大家介紹了關(guān)于在MacOS系統(tǒng)下Unity啟動(dòng)黑屏的解決方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。
    2018-01-01
  • IOS 中CALayer繪制圖片的實(shí)例詳解

    IOS 中CALayer繪制圖片的實(shí)例詳解

    這篇文章主要介紹了IOS 中CALayer繪制圖片的實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-10-10

最新評(píng)論