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上的數字也就無法更新。
修改NSTimer的run loop
解決方案就是將其加入到UITrackingRunLoopMode模式或NSRunLoopCommonModes模式中。
[[NSRunLoop currentRunLoop] addTimer:timer forMode:UITrackingRunLoopMode];
或者
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
NSRunLoopCommonModes:是一個模式集合,當綁定一個事件來源到這個模式集合的時候就相當於綁定到了集合內的每一個模式。