iOS gcdTimer VS NSTimer

iOS中定時器的使用
demo地址:
https://github.com/liuxuleidota/LXLGCDTimer
使用NSTimer蔚万,注意點:
一、切換runloop時失效
默認情況下NSTimer會加入到runloop defaultMode中早敬,當界面上有scrollview滑動時,runloop會切換到trackingMode每强,此時NSTimer會暫停稿静,如果要避免此情況,如下:

- (IBAction)startNSTimer:(id)sender {
    _nsTimer = [NSTimer timerWithTimeInterval:1 repeats:YES block:^(NSTimer * _Nonnull timer) {
        NSLog(@"%@ xxxx", NSTimerName);
    }];
    [[NSRunLoop mainRunLoop] addTimer:_nsTimer forMode:NSRunLoopCommonModes];
}

二桶雀、可能引起內(nèi)存泄漏
NSTimer與self相互持有矿酵,使用weakSelf解除循環(huán)引用:

    __weak typeof(self) weakSelf = self;
    NSTimer *timer = [NSTimer timerWithTimeInterval:1 repeats:YES block:^(NSTimer * _Nonnull timer) {
        [weakSelf doSth];
    }];
    [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

這樣self可以正常走dealloc,但是矗积,在self銷毀后全肮,timer并不會銷毀!因為runloop仍然持有著timer
所以需要在必要的位置棘捣,停止timer辜腺,比如viewController的viewWillDisapper中(但是viewWillDisapper調(diào)用時機有很多,只要有新的controller覆蓋當前的controller,此方法就會調(diào)用评疗,所以是否要在viewWillDisapper中調(diào)用测砂,請根據(jù)自己的業(yè)務邏輯來處理)
我的做法:

//runloop雖然會強持有timer,但是是在把timer加入runloop之后百匆,所以還是要強持有timer砌些,arc會處理這個strong,沒關系
@property(nonatomic, strong) NSTimer *nsTimer;

- (void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
    
    [self cancelNSTimer];
}

- (void)dealloc{
    [self cancelNSTimer];
    NSLog(@"%@ is dealloced, timer=%@", self, _nsTimer);
}

- (void)doSth{
    //doSth
    //when sth is done
    [self cancelNSTimer];
}

- (void)cancelNSTimer{
    if (!_nsTimer) {
        return;
    }
    
    //從runloop移除timer
    [_nsTimer invalidate];
    
    //將timer置為nil加匈,如果沒有此行存璃,在dealloc中打印仍然可以看到timer不為空
    //至于在dealloc方法走完,self銷毀后雕拼,timer是否被銷毀纵东,這里沒有進一步測試,因為NSTimer不能子類化
    _nsTimer = nil;
}

三啥寇、不能跨線程操作NSTimer?
此點有疑問篮迎,如下:

- (void)cancelNSTimer{
    if (!_nsTimer) {
        return;
    }
    
    dispatch_queue_t queue = dispatch_queue_create("com.levi.queue", NULL);
    
    dispatch_sync(queue, ^{
        [_nsTimer invalidate];
        _nsTimer = nil;
    });
}

timer是在主線程中創(chuàng)建的,但是這里我在子線程中操作示姿,同樣有效甜橱,有知道的請解答下


使用GCDTimer
引入demo中LXLGCDTimer目錄
一、創(chuàng)建GCDTimer

- (IBAction)startGCDTimer:(id)sender {
    [LXLGCDTimerManager.sharedInstance scheduleGCDTimerWithName:self.timerName interval:1 queue:dispatch_get_main_queue() repeats:YES option:CancelPreviousTimerAction action:^{
        //此方法中請使用weakSelf
        NSLog(@"%@ xxxx", GCDTimerName);
    }];
}

二栈戳、實現(xiàn)以下方法

//也可自己實現(xiàn)timerName方法岂傲,達到同一界面添加多個定時器目的
- (NSString *)timerName{
    return [NSString stringWithFormat:@"%@timer", NSStringFromClass(self.class)];
}

- (void)cancelGCDTimer{
    [LXLGCDTimerManager.sharedInstance cancelTimerWithName:self.timerName];
}

//適當位置取消定時器,不然也會出現(xiàn)像NSTimer一樣的情況子檀,controller已經(jīng)銷毀镊掖,但是定時器仍然在運行!
- (void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
    
    [self cancelGCDTimer];
}

- (void)dealloc{
    [self cancelGCDTimer];
}

本來想寫的標題是用gcdTimer替代NSTimer可以避免很多坑褂痰,但是寫完發(fā)現(xiàn)其實NSTimer使用正確的話亩进,代碼量跟gcdTimer是一樣的(還不包括引入的LXLGCDTimer!)
總結:都可以用缩歪!

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末归薛,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子匪蝙,更是在濱河造成了極大的恐慌主籍,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逛球,死亡現(xiàn)場離奇詭異千元,居然都是意外死亡,警方通過查閱死者的電腦和手機颤绕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門幸海,熙熙樓的掌柜王于貴愁眉苦臉地迎上來祟身,“玉大人,你說我怎么就攤上這事物独⊥嗔颍” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵议纯,是天一觀的道長。 經(jīng)常有香客問我溢谤,道長瞻凤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任世杀,我火速辦了婚禮阀参,結果婚禮上,老公的妹妹穿的比我還像新娘瞻坝。我一直安慰自己蛛壳,他們只是感情好,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布所刀。 她就那樣靜靜地躺著衙荐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪浮创。 梳的紋絲不亂的頭發(fā)上忧吟,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機與錄音斩披,去河邊找鬼溜族。 笑死,一個胖子當著我的面吹牛垦沉,可吹牛的內(nèi)容都是我干的煌抒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼厕倍,長吁一口氣:“原來是場噩夢啊……” “哼寡壮!你這毒婦竟也來了?” 一聲冷哼從身側響起讹弯,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤诬像,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后闸婴,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坏挠,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年邪乍,在試婚紗的時候發(fā)現(xiàn)自己被綠了降狠。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片对竣。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖榜配,靈堂內(nèi)的尸體忽然破棺而出否纬,到底是詐尸還是另有隱情,我是刑警寧澤蛋褥,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布临燃,位于F島的核電站,受9級特大地震影響烙心,放射性物質(zhì)發(fā)生泄漏膜廊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一淫茵、第九天 我趴在偏房一處隱蔽的房頂上張望爪瓜。 院中可真熱鬧,春花似錦匙瘪、人聲如沸铆铆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽薄货。三九已至,卻和暖如春碍论,著一層夾襖步出監(jiān)牢的瞬間菲驴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工骑冗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留赊瞬,地道東北人。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓贼涩,卻偏偏與公主長得像巧涧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子遥倦,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

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

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結構(3).初始化時...
    歐辰_OSR閱讀 29,405評論 8 265
  • 說明iOS中的RunLoop使用場景1.保持線程的存活谤绳,而不是線性的執(zhí)行完任務就退出了<1>不開啟RunLoop的...
    野生塔塔醬閱讀 6,800評論 15 109
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,109評論 1 32
  • Runloop 是和線程緊密相關的一個基礎組件,是很多線程有關功能的幕后功臣袒哥。盡管在平常使用中幾乎不太會直接用到缩筛,...
    jackyshan閱讀 9,862評論 10 75
  • 去年錯過了馬自騎這一大盛會瞎抛,想來今年不能錯過,做一位志愿者却紧,成為在比賽中遞水的那個人桐臊。發(fā)起者和組織者胎撤,總也有各種各...
    _非閱讀 123評論 0 0