dispatch source 總結(jié)

項目里用到定時器時,看同事是這么寫的:

@property (nonatomic,strong) dispatch_source_t timer;

if (!self.timer) {
        dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
        self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
        dispatch_time_t start = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0 * NSEC_PER_SEC));
        uint64_t interval = (uint64_t)(1 * NSEC_PER_SEC);
        dispatch_source_set_timer(self.timer, start, interval, 0);
        dispatch_source_set_event_handler(self.timer, ^{
            //            NSLog(@"定時器開啟中........");
            dispatch_async(dispatch_get_main_queue(), ^{
            //            主線程添加事件處理
            });
        });
        
        //啟動定時器
        dispatch_resume(self.timer);
    }

/**
 * 移除定時器
 */
- (void)removeTimer {
    if (self.timer) {
        dispatch_source_cancel(self.timer);
        self.timer = nil;
    }
}

跟自己寫的NSTimer檔次不一樣巍糯,感覺這個逼格好高啊齿穗,然后就研究了下 dispatch_sourcer在定時器里的使用,如下喊括。

定時器dispatch source定時產(chǎn)生事件胧瓜,可以用來發(fā)起定時執(zhí)行的任務(wù),所有定時器dispatch source都是間隔定時器郑什,一旦創(chuàng)建府喳,會按你指定的間隔定期遞送事件。你需要為定時器dispatch source指定一個期望的定時器事件精度蘑拯,也就是leeway值钝满,讓系統(tǒng)能夠靈活地管理電源并喚醒內(nèi)核。例如系統(tǒng)可以使用leeway值來提前或延遲觸發(fā)定時器申窘,使其更好地與其它系統(tǒng)事件結(jié)合弯蚜。創(chuàng)建自己的定時器時,你應(yīng)該盡量指定一個leeway值剃法。

就算你指定leeway值為0碎捺,也不要期望定時器能夠按照精確的納秒來觸發(fā)事件。系統(tǒng)會盡可能地滿足你的需求玄窝,但是無法保證完全精確的觸發(fā)時間牵寺。

當計算機睡眠時,定時器dispatch source會被掛起恩脂,稍后系統(tǒng)喚醒時帽氓,定時器dispatch source也會自動喚醒。根據(jù)你提供的配置俩块,暫停定時器可能會影響定時器下一次的觸發(fā)黎休。如果定時器dispatch source使用 dispatch_time 函數(shù)或DISPATCH_TIME_NOW 常量設(shè)置浓领,定時器dispatch source會使用系統(tǒng)默認時鐘來確定何時觸發(fā),但是默認時鐘在計算機睡眠時不會繼續(xù)势腮。

如果你使用dispatch_walltime函數(shù)來設(shè)置定時器dispatch source联贩,則定時器會根據(jù)掛鐘時間來跟蹤,這種定時器比較適合觸發(fā)間隔相對比較大的場合捎拯,可以防止定時器觸發(fā)間隔出現(xiàn)太大的誤差泪幌。

下面是定時器dispatch source的一個例子,每30秒觸發(fā)一次署照,leeway值為1祸泪,因為間隔相對較大,使用 dispatch_walltime 來創(chuàng)建定時器建芙。定時器會立即觸發(fā)第一次没隘,隨后每30秒觸發(fā)一次。MyPeriodicTask 和 MyStoreTimer 是自定義函數(shù)禁荸,用于實現(xiàn)定時器的行為右蒲,并存儲定時器到應(yīng)用的數(shù)據(jù)結(jié)構(gòu)。

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

void MyCreateTimer() 
{ 
dispatch_source_t aTimer = CreateDispatchTimer(30ull * NSEC_PER_SEC, 
1ull * NSEC_PER_SEC, 
dispatch_get_main_queue(), 
^{ MyPeriodicTask(); });

// Store it somewhere for later use. 
if (aTimer) 
{ 
MyStoreTimer(aTimer); 
} 
}

雖然定時器dispatch source是接收時間事件的主要方法赶熟,你還可以使用其它選擇瑰妄。如果想在指定時間間隔后執(zhí)行一個block,可以使用 dispatch_after 或 dispatch_after_f函數(shù)映砖。這兩個函數(shù)非常類似于dispatch_async翰撑,但是只允許你指定一個時間值,時間一到就自動提交block到queue中執(zhí)行啊央,時間值可以指定為相對或絕對時間。

支持原創(chuàng)

然后我總結(jié)了下用dispatch_source寫定時器的優(yōu)缺點
優(yōu)點:
1涨醋、可以暫停瓜饥,繼續(xù)。 不用像NSTimer一樣需要重新創(chuàng)建浴骂。
2乓土、性能較好。
缺點:
1溯警、每次resume都會先執(zhí)行一次趣苏。
共同點:
1、如果不手動釋放就不會走dealloc梯轻。
2食磕、不精確

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市喳挑,隨后出現(xiàn)的幾起案子彬伦,更是在濱河造成了極大的恐慌滔悉,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件单绑,死亡現(xiàn)場離奇詭異回官,居然都是意外死亡,警方通過查閱死者的電腦和手機搂橙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門歉提,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事勋篓】阶耍” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵恋拷,是天一觀的道長。 經(jīng)常有香客問我厅缺,道長蔬顾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任湘捎,我火速辦了婚禮诀豁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘窥妇。我一直安慰自己舷胜,他們只是感情好,可當我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布活翩。 她就那樣靜靜地躺著烹骨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪材泄。 梳的紋絲不亂的頭發(fā)上沮焕,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天,我揣著相機與錄音拉宗,去河邊找鬼峦树。 笑死,一個胖子當著我的面吹牛旦事,可吹牛的內(nèi)容都是我干的魁巩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼姐浮,長吁一口氣:“原來是場噩夢啊……” “哼谷遂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起单料,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤埋凯,失蹤者是張志新(化名)和其女友劉穎点楼,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體白对,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡掠廓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了甩恼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蟀瞧。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖条摸,靈堂內(nèi)的尸體忽然破棺而出悦污,到底是詐尸還是另有隱情,我是刑警寧澤钉蒲,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布切端,位于F島的核電站,受9級特大地震影響顷啼,放射性物質(zhì)發(fā)生泄漏踏枣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一钙蒙、第九天 我趴在偏房一處隱蔽的房頂上張望茵瀑。 院中可真熱鬧,春花似錦躬厌、人聲如沸马昨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鸿捧。三九已至,卻和暖如春疙渣,著一層夾襖步出監(jiān)牢的瞬間笛谦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工昌阿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人恳邀。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓懦冰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親谣沸。 傳聞我的和親對象是個殘疾皇子刷钢,可洞房花燭夜當晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容