iOS裏面使用的定時器類型通常有三種NSTimer、CADisplayLink、GCD。oop
一、最精準的定時器 - GCDatom
#import "ViewController.h" @interface ViewController () // 必需要有強引用,否則對象會被釋放 @property (nonatomic , strong) dispatch_source_t timer ; @end @implementation ViewController -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ NSLog(@"__%s__",__func__); #warning 重複執行的GCD定時器 // 一、基於GCD的定時器,建立timer對象: // 參數一:source的類型DISPATCH_SOURCE_TYPE_TIMER 表示定時器類型 // 參數二:描述內容,好比線程ID // 參數三:詳細描述內容 // 參數四:隊列,決定GCD的隊列在哪一個線程執行 dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(0, 0)); // 二、基於GCD的定時器,建立timer對象: // 參數一:定時器對象timer // 參數二:起始時間,DISPATCH_TIME_NOW表示從如今開始 // 參數三:多少時間內執行 // 參數四:精準度 絕對精準爲0 dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 2.0 * NSEC_PER_SEC, 0 * NSEC_PER_SEC); // 三、執行內容 dispatch_source_set_event_handler(timer, ^{ NSLog(@"===%@===",[NSThread currentThread]); }); // 四、啓動執行 dispatch_resume(timer); // 五、增長強引用 self.timer = timer; #warning 執行一次的GCD定時器 // 1. 延遲幾秒後執行 double delayInSeconds = 2.0; // 2. 建立dispatch_time_t類對象 dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); // 3. 幾秒後實際執行的事件 dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ //執行事件 }); } @end
二、最簡單的定時器 - NSTimerspa
// 建立定時器 NSTimer *timer = [NSTimer timerWithTimeInterval:5 target:self selector:@selector(timerAction) userInfo:nil repeats:YES]; // 將定時器加入RUNLOOP的運行循環 [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
三、最適合作界面渲染的定時器 - CSDisplayLink 線程
// 1. 建立方法 self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(handleDisplayLink:)]; [self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; // 2. 中止方法 [self.displayLink invalidate]; self.displayLink = nil; /**當把CADisplayLink對象add到runloop中後,selector就能被週期性調用,相似於重複的NSTimer被啓動了;執行invalidate操做時,CADisplayLink對象就會從runloop中移除,selector調用也隨即中止,相似於NSTimer的invalidate方法。**/ // 重要的屬性: // frameInterval:NSInteger類型的值,用來設置間隔多少幀調用一次selector方法,默認值是1,即每幀都調用一次。 // duration:readOnly的CFTimeInterval值,表示兩次屏幕刷新之間的時間間隔。須要注意的是,該屬性在target的selector被首次調用之後纔會被賦值。selector的調用間隔時間計算方式是:調用間隔時間 = duration × frameInterval。