iOS dispatch_source_t 定時(shí)器

前言

NSTimer受runloop的影響江醇,由于runloop需要處理很多任務(wù),導(dǎo)致NSTimer的精度降低,在日常開發(fā)中囱稽,如果我們需要對定時(shí)器的精度要求很高的話,可以考慮dispatch_source_t去實(shí)現(xiàn) 二跋。dispatch_source_t精度很高战惊,系統(tǒng)自動(dòng)觸發(fā),系統(tǒng)級別的源

代碼

__block int timeout=30; //倒計(jì)時(shí)時(shí)間
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);
    
    //開始的時(shí)間
    dispatch_time_t startTime = dispatch_walltime(NULL, 1.0 * NSEC_PER_SEC);
    //間隔的時(shí)間
    uint64_t interval = 1.0 * NSEC_PER_SEC;
    
    dispatch_source_set_timer(_timer,startTime,interval, 0); //每秒執(zhí)行
    dispatch_source_set_event_handler(_timer, ^{
        
        if(timeout<=0){ //倒計(jì)時(shí)結(jié)束扎即,關(guān)閉
            dispatch_source_cancel(_timer);
            dispatch_async(dispatch_get_main_queue(), ^{
                //設(shè)置界面的按鈕顯示 根據(jù)自己需求設(shè)置
                
            });
        }else{
            //            int minutes = timeout / 60;
            int seconds = timeout % 60;
            NSString *strTime = [NSString stringWithFormat:@"%.2d", seconds];
            dispatch_async(dispatch_get_main_queue(), ^{
                //設(shè)置界面的按鈕顯示 根據(jù)自己需求設(shè)置
                NSLog(@"____%@",strTime);
                
            });
            timeout--;
        }
    });
    //啟動(dòng)定時(shí)器
    dispatch_resume(_timer);

解析開始的時(shí)間

dispatch_time_t 類型吞获,它的創(chuàng)建有兩個(gè)函數(shù)
     1. dispatch_time(<#dispatch_time_t when#>, <#int64_t delta#>)
        第一個(gè)參數(shù)是從什么時(shí)間開始,一般直接傳 DISPATCH_TIME_NOW; 表示從現(xiàn)在開始
        第二個(gè)參數(shù)表示具體的時(shí)間長度(不能直接傳 int 或 float), 可以寫成這種形式 (int64_t)3* NSEC_PER_SEC
        
        #define NSEC_PER_SEC 1000000000ull  每秒有1000000000納秒
        #define NSEC_PER_MSEC 1000000ull    每毫秒有1000000納秒
        #define USEC_PER_SEC 1000000ull     每秒有1000000微秒
        #define NSEC_PER_USEC 1000ull       每微秒有1000納秒
        
        注意 delta 的單位是納秒! 
        1秒的寫作方式可以是 1* NSEC_PER_SEC; 1000* NSEC_PER_MSEC; USEC_PER_SEC* NSEC_PER_USEC
     
     2. dispatch_walltime(<#const struct timespec * _Nullable when#>, <#int64_t delta#>),
        第一個(gè)參數(shù)是一個(gè)結(jié)構(gòu)體, 創(chuàng)建的是一個(gè)絕對的時(shí)間點(diǎn),比如 2016年10月10日8點(diǎn)30分30秒, 如果你不需要自某一個(gè)特定的時(shí)刻開始,可以傳 NUll,表示自動(dòng)獲取當(dāng)前時(shí)區(qū)的當(dāng)前時(shí)間作為開始時(shí)刻, 第二參數(shù)意義同第一個(gè)函數(shù)
        dispatch_time_t time = dispatch_walltime(NULL, 5* NSEC_PER_SEC);
        
     兩個(gè)函數(shù)的不同
       例如: 從現(xiàn)在開始,1小時(shí)之后是觸發(fā)某個(gè)事件
       使用第一個(gè)函數(shù)創(chuàng)建的是一個(gè)相對的時(shí)間,第一個(gè)參數(shù)開始時(shí)間參考的是當(dāng)前系統(tǒng)的時(shí)鐘,當(dāng) device 進(jìn)入休眠之后,系統(tǒng)的時(shí)鐘也會(huì)進(jìn)入休眠狀態(tài), 第一個(gè)函數(shù)同樣被掛起; 假如 device 在第一個(gè)函數(shù)開始執(zhí)行后10分鐘進(jìn)入了休眠狀態(tài),那么這個(gè)函數(shù)同時(shí)也會(huì)停止執(zhí)行,當(dāng)你再次喚醒 device 之后,該函數(shù)同時(shí)被喚醒,但是事件的觸發(fā)就變成了從喚醒 device 的時(shí)刻開始,1小時(shí)之后
       而第二個(gè)函數(shù)則不同,他創(chuàng)建的是一個(gè)絕對的時(shí)間點(diǎn),一旦創(chuàng)建就表示從這個(gè)時(shí)間點(diǎn)開始,1小時(shí)之后觸發(fā)事件,假如 device 休眠了10分鐘,當(dāng)再次喚醒 device 的時(shí)候,計(jì)算時(shí)間間隔的時(shí)間起點(diǎn)還是 開始時(shí)就設(shè)置的那個(gè)時(shí)間點(diǎn), 而不會(huì)受到 device 是否進(jìn)入休眠影響
參考文章

http://blog.csdn.net/wpeng20125/article/details/73650569
http://blog.csdn.net/cuichengjie/article/details/45912809

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市谚鄙,隨后出現(xiàn)的幾起案子各拷,更是在濱河造成了極大的恐慌,老刑警劉巖襟锐,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撤逢,死亡現(xiàn)場離奇詭異,居然都是意外死亡粮坞,警方通過查閱死者的電腦和手機(jī)蚊荣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門栅炒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來裙顽,“玉大人,你說我怎么就攤上這事这敬◇菽郑” “怎么了媳叨?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長关顷。 經(jīng)常有香客問我糊秆,道長,這世上最難降的妖魔是什么议双? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任痘番,我火速辦了婚禮,結(jié)果婚禮上平痰,老公的妹妹穿的比我還像新娘汞舱。我一直安慰自己,他們只是感情好宗雇,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布昂芜。 她就那樣靜靜地躺著,像睡著了一般赔蒲。 火紅的嫁衣襯著肌膚如雪泌神。 梳的紋絲不亂的頭發(fā)上良漱,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機(jī)與錄音腻扇,去河邊找鬼债热。 笑死,一個(gè)胖子當(dāng)著我的面吹牛幼苛,可吹牛的內(nèi)容都是我干的窒篱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼舶沿,長吁一口氣:“原來是場噩夢啊……” “哼墙杯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起括荡,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤高镐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后畸冲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嫉髓,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年邑闲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了算行。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡苫耸,死狀恐怖州邢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情褪子,我是刑警寧澤量淌,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站嫌褪,受9級特大地震影響呀枢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜笼痛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一硫狞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧晃痴,春花似錦、人聲如沸财忽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽即彪。三九已至紧唱,卻和暖如春活尊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背漏益。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工蛹锰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绰疤。 一個(gè)月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓铜犬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親轻庆。 傳聞我的和親對象是個(gè)殘疾皇子癣猾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評論 2 354