NSTimer不準的問題及解決

Runloop Timer為什么不準炬太?
1:Runloop Timer底層使用的timer精度不高;
2:與Runloop底層的調用機制有關系。

情況產生:
1洞焙、NSTimer被添加在mainRunLoop中寒矿,模式是NSDefaultRunLoopMode突琳,mainRunLoop負責所有主線程事件,例如UI界面的操作劫窒,復雜的運算使當前RunLoop持續(xù)的時間超過了定時器的間隔時間本今,那么下一次定時就被延后,這樣就會造成timer的阻塞主巍。
2:模式的切換冠息,當創(chuàng)建的timer被加入到NSDefaultRunLoopMode時,此時如果有滑動UIScrollView的操作孕索,runLoop 的mode會切換為TrackingRunLoopMode逛艰,這是timer會停止回調。

解決:
1:在主線程中創(chuàng)建timer搞旭,timer添加到當前Runloop并設置RunloopType為NSRunLoopCommonModes散怖。
2: 在子線程中創(chuàng)建timer,GCD操作:dispatch_source_create肄渗,創(chuàng)建定時器镇眷,dispatch_source_set_timer :設置定時器。dispatch_resume:啟動翎嫡。
3:CADisplayLink(頻率能達到屏幕刷新率的定時器類):displayLinkWithTarget欠动,addToRunLoop

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

/* 定時器 */
@property (nonatomic, strong) NSTimer *timer;

@property  (nonatomic , strong ) dispatch_source_t  atimer;

@end
#import "ViewController.h"

@interface ViewController ()

{
    UILabel *_label;
}

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    _label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 50)];
    _label.center = self.view.center;
    _label.textColor = [UIColor blackColor];
    _label.textAlignment = NSTextAlignmentCenter;
    [self.view addSubview:_label];
    
    //正常用法,作用于主線程的runloop惑申,主線程要處理UI會影響精準度具伍,Scollview滑動時mode切換為TrackingRunLoopMode,NSTimer會停止回調圈驼。
    [self normalUser];
    
    //1人芽、在主線程中切換runloopMode
    [self mainloopchangemode];
    
    //2、異步線程創(chuàng)建NSTimer
    [self asyCreateTimer];
    
    //3绩脆、使用CADisplayLink
    [self userCADisplyLink];
}
int i = 0;
-(void)normalUser{
    self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(addtime) userInfo:nil repeats:YES];
}
-(void)mainloopchangemode{
    [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
}
-(void)asyCreateTimer{
    self.atimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());
    dispatch_source_set_timer(self.atimer, DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC, 1 * NSEC_PER_SEC );
    dispatch_source_set_event_handler(self.atimer, ^{
        self->_label.text = [NSString stringWithFormat:@"當前:%d",i];
        i++;
    });
    dispatch_resume(self.atimer);
}
-(void)userCADisplyLink{
    //較為精準萤厅,與屏幕刷新幀率同步,多用戶視圖渲染或繪圖
    CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(addtime)];
    [link addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
}
-(void)addtime{
    _label.text = [NSString stringWithFormat:@"當前:%d",i];
    i++;
}
@end
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末衙伶,一起剝皮案震驚了整個濱河市祈坠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌矢劲,老刑警劉巖赦拘,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異芬沉,居然都是意外死亡躺同,警方通過查閱死者的電腦和手機阁猜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蹋艺,“玉大人剃袍,你說我怎么就攤上這事∩咏鳎” “怎么了民效?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長涛救。 經常有香客問我畏邢,道長,這世上最難降的妖魔是什么检吆? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任舒萎,我火速辦了婚禮,結果婚禮上蹭沛,老公的妹妹穿的比我還像新娘臂寝。我一直安慰自己,他們只是感情好摊灭,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布咆贬。 她就那樣靜靜地躺著,像睡著了一般帚呼。 火紅的嫁衣襯著肌膚如雪素征。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天萝挤,我揣著相機與錄音,去河邊找鬼根欧。 笑死怜珍,一個胖子當著我的面吹牛,可吹牛的內容都是我干的凤粗。 我是一名探鬼主播酥泛,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼嫌拣!你這毒婦竟也來了柔袁?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤异逐,失蹤者是張志新(化名)和其女友劉穎捶索,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體灰瞻,經...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡腥例,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年辅甥,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片燎竖。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡璃弄,死狀恐怖,靈堂內的尸體忽然破棺而出构回,到底是詐尸還是另有隱情夏块,我是刑警寧澤,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布纤掸,位于F島的核電站脐供,受9級特大地震影響,放射性物質發(fā)生泄漏茁肠。R本人自食惡果不足惜患民,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望垦梆。 院中可真熱鬧匹颤,春花似錦、人聲如沸托猩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽京腥。三九已至赦肃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間公浪,已是汗流浹背他宛。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留欠气,地道東北人厅各。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像预柒,于是被迫代替她去往敵國和親队塘。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內容