GCD建立定時器和NSTimer定時器
阿新 • • 發佈:2019-01-08
NSTimer定時器不準,因為scheduleTimer放在runloop裡面,受runloop模式影響會不準,可以建立建立GCD定時器。
GCD不受RunLoop的影響(比如:scrollView在拖動的時候,定時器照樣執行)
@interface ViewController ()
/**
* 定時器(這裡不用帶,因為dispatch_source_t就是個類,內部已經包含了)
*/
@property(nonatomic, strong) dispatch_source_t timer;
@end
@implementation ViewController
int count = 0;
-(void)touchesBegan:(NSSet )touches withEvent:(UIEvent )event
{
// 獲得佇列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 建立一個定時器(dispatch_source_t本質還是個OC物件,創建出來的物件需要強引用) self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue); // 設定定時器的各種屬性(幾時開始任務,每隔多長時間執行一次) // GCD的時間引數,一般是納秒(1秒 = 10的9次方納秒) // 何時開始執行第一個任務 dispatch_time_t start = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)); //比當前時間晚3秒 // dispatch_time_t start = DISPATCH_TIME_NOW;// 當前時間執行 uint64_t interval= 2.0 * NSEC_PER_SEC; dispatch_source_set_timer(self.timer, start, interval, 0); // NSEC_PER_SEC 納秒 // 設定回撥 dispatch_source_set_event_handler(self.timer, ^{ NSLog(@"-----------%@", [NSThreadcurrentThread]); count ++; if (count == 4) { // 取消定時器 dispatch_cancel(self.timer); self.timer = nil; } }); // 啟動定時器 dispatch_resume(self.timer);
}
@end