iOS 【NSTimer定時器不準(zhǔn)的問題和GCD創(chuàng)建定時器】

一碌识、NSTimer定時器不準(zhǔn):

如果在子線程中創(chuàng)建Timer,那么當(dāng)我們add到RunLoop的時候有NSDefaultRunLoopMode和NSRunLoopCommonModes兩種模式可以選擇

  • 這里不像主線程,子線程需要創(chuàng)建loop并且run起來痹筛,不然是不會連續(xù)跑任務(wù)的
  • 不準(zhǔn)的原因在于莺治,當(dāng)我們在NSDefaultRunLoopMode模式下跑的時候,我們滾動例如TableView的時候切換到
  • TrackingMode,loop會退出當(dāng)前mode帚稠,重新進入指定的mode谣旁,如果NSTimer不是加到NSRunLoopCommonModes
  • 那么任務(wù)跑起來一直在切換,肯定會不準(zhǔn)
NSTimer *timer= [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(timerRun) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];  

[[NSRunLoop currentRunLoop] run];

二滋早、GCD創(chuàng)建定時器

GCD創(chuàng)建的定時器不受RunLoop中Modes影響榄审;
注意:將定時器寫成屬性,是因為內(nèi)存管理的原因杆麸,使用了dispatch_source_create方法搁进,這種方法GCD是不會幫你管理內(nèi)存的浪感。

@property (nonatomic,strong) dispatch_source_t timer;

/**
創(chuàng)建一個定時器
參數(shù)1:代表創(chuàng)建一個定時器
參數(shù)4:隊列
這里的強引用是因為,當(dāng)我定時器延時幾秒調(diào)用的時候饼问,局部變量就死了影兽,我們需要強引用起來
*/

self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(0, 0));  

/**
設(shè)置定時器
參數(shù)1:定時器對象
參數(shù)2:GCD dispatch_time_t 里面的都是納秒 創(chuàng)建一個距離現(xiàn)在多少秒開啟的任務(wù)
參數(shù)3:間隔多少秒調(diào)用一次
問題:DISPATCH_TIME_NOW用這個,開始倒計時那1-2s會跑得有點快
dispatch_source_set_timer(self.timer,DISPATCH_TIME_NOW,1.0*NSEC_PER_SEC, 0);
*/

dispatch_source_set_timer(self.timer, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), (uint64_t)(1.0 * NSEC_PER_SEC), 0); // 設(shè)置回調(diào)  

//執(zhí)行這個以后莱革,會立即執(zhí)行一次
dispatch_source_set_event_handler(self.timer, ^{  
 });  
dispatch_resume(self.timer);
}

參數(shù)詳解:

dispatch_source_create(dispatch_source_type_t type,
 uintptr_t handle,
 unsigned long mask,
 dispatch_queue_t _Nullable queue)

第一個參數(shù):dispatch_source_type_t type為設(shè)置GCD源方法的類型峻堰,前面已經(jīng)列舉過了。
第二個參數(shù):uintptr_t handle Apple的API介紹說盅视,暫時沒有使用捐名,傳0即可。
第三個參數(shù):unsigned long mask Apple的API介紹說闹击,使用DISPATCH_TIMER_STRICT镶蹋,會引起電量消耗加劇,畢竟要求精確時間拇砰,所以一般傳0即可梅忌,視業(yè)務(wù)情況而定。
第四個參數(shù):dispatch_queue_t _Nullable queue 隊列除破,將定時器事件處理的Block提交到哪個隊列之上牧氮。可以傳Null瑰枫,默認為全局隊列踱葛。

dispatch_source_set_timer(dispatch_source_t source,
 dispatch_time_t start,
 uint64_t interval,
 uint64_t leeway);

第一個參數(shù):dispatch_source_t source......不用說了
第二個參數(shù):dispatch_time_t start, 定時器開始時間,類型為 dispatch_time_t光坝,其API的abstract標(biāo)明可參照dispatch_time()dispatch_walltime()尸诽,同為設(shè)置時間,但是后者為“鐘表”時間盯另,相對比較準(zhǔn)確性含,所以選擇使用后者。dispatch_walltime(const struct timespec *_Nullable when, int64_t delta),參數(shù)when可以為Null鸳惯,默認為獲取當(dāng)前時間商蕴,參數(shù)delta為增量,即獲取當(dāng)前時間的基礎(chǔ)上芝发,增加X秒的時間為開始計時時間绪商,此處傳0即可。
第三個參數(shù):uint64_t interval辅鲸,定時器間隔時長格郁,由業(yè)務(wù)需求而定。
第四個參數(shù):uint64_t leeway, 允許誤差例书,此處傳0即可锣尉。


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市雾叭,隨后出現(xiàn)的幾起案子悟耘,更是在濱河造成了極大的恐慌,老刑警劉巖织狐,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件暂幼,死亡現(xiàn)場離奇詭異,居然都是意外死亡移迫,警方通過查閱死者的電腦和手機旺嬉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來厨埋,“玉大人邪媳,你說我怎么就攤上這事〉聪荩” “怎么了雨效?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長废赞。 經(jīng)常有香客問我徽龟,道長,這世上最難降的妖魔是什么唉地? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任据悔,我火速辦了婚禮,結(jié)果婚禮上耘沼,老公的妹妹穿的比我還像新娘极颓。我一直安慰自己,他們只是感情好群嗤,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布菠隆。 她就那樣靜靜地躺著,像睡著了一般狂秘。 火紅的嫁衣襯著肌膚如雪骇径。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天赃绊,我揣著相機與錄音既峡,去河邊找鬼羡榴。 笑死碧查,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播忠售,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼传惠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了稻扬?” 一聲冷哼從身側(cè)響起卦方,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎泰佳,沒想到半個月后盼砍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡逝她,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年浇坐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片黔宛。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡近刘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出臀晃,到底是詐尸還是另有隱情觉渴,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布徽惋,位于F島的核電站案淋,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏寂曹。R本人自食惡果不足惜哎迄,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望隆圆。 院中可真熱鬧漱挚,春花似錦、人聲如沸渺氧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽侣背。三九已至白华,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間贩耐,已是汗流浹背弧腥。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留潮太,地道東北人管搪。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓虾攻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親更鲁。 傳聞我的和親對象是個殘疾皇子霎箍,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

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