天天看點

iOS開發之NSTimer使用初探

這個周日,我的大學同學結婚。他們的婚禮選在鄭州舉辦。他不是鄭州的,他女朋友也不是鄭州的。但是他們是在鄭州相識相愛,最終走到一起的,是以他們選擇在鄭州舉辦婚禮。

這幾年大家都在各自忙碌着,很少有見面的機會。不過經常會電話聯系,互相了解一下情況。

作為兄弟,我打心底為他們高興,為他們祝福。我也會到現場參加,估計現在我已經坐上開發鄭州的動車了。

我喜歡走出去的感覺,很喜歡坐車,去各個地方,哪怕是路過。感覺走的越遠,離心越近。辭職去旅行也許很快就可以實作。

最近我在改一個bug,在一個UIViewController上有一個定時器,在執行輪播圖檔。push到别的UIViewController的時候,暫停定時器(NSTimer);pop回來的時候,開啟定時器(NSTimer)。這個bug是:push到别的UIViewController暫定定時器(NSTimer),有時候有作用,有時候沒有作用。

開始我以為是NSTimer運作的run loop有問題,最後發現是别的地方導緻這個bug的。不過正好,我們來一起了解一下NSTimer。

建立一個定時器(NSTimer)

- (void)viewDidLoad {
    [super viewDidLoad];
    [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(actionTimer:) userInfo:nil repeats:YES];
}

- (void)actionTimer:(NSTimer *)timer
{

}
           

NSTimer預設運作在default mode下,default mode幾乎包括所有輸入源(除NSConnection) NSDefaultRunLoopMode模式。

actionTimer方法會每隔1s中被調用一次。NSTimer使用起來是不是非常簡單。這是NSTimer比較初級的應用。

當主界面被滑動時NSTimer失效了

主界面被滑動是什麼意思呢?就是說主界面有UITableView或者UIScrollView,滑動UITableView或者UIScrollView。這個時候NSTimer失效了。

我們來寫一個demo,在一個有UITableView的UIViewController上啟動定時器,每1s數字加1,并将這個數字顯示在UILabel上面.

- (void)viewDidLoad {
    [super viewDidLoad];
    [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(actionTimer:) userInfo:nil repeats:YES];
}

- (void)actionTimer:(NSTimer *)timer
{
    self.number++;
    self.label.text = [NSString stringWithFormat:@"%d",self.number];
    NSLog(@"%d",self.number);
}
           

關于UITableView和UILabel的建立我省去了。詳細的代碼可以點選這裡下載下傳:iOSStrongDemo,iOSStrongDemo我會不斷更新,大家在github上star一下。

這樣當使用者在拖動UITableView處于UITrackingRunLoopMode時,NSTimer就失效了,不能fire。self.label上的數字也就無法更新。

iOS開發之NSTimer使用初探

修改NSTimer的run loop

解決方法就是将其加入到UITrackingRunLoopMode模式或NSRunLoopCommonModes模式中。

[[NSRunLoop currentRunLoop] addTimer:timer forMode:UITrackingRunLoopMode];
           

或者

[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
           

NSRunLoopCommonModes:是一個模式集合,當綁定一個事件源到這個模式集合的時候就相當于綁定到了集合内的每一個模式。

iOS開發之NSTimer使用初探

代碼下載下傳位址::iOSStrongDemo

繼續閱讀