1. 程式人生 > >GCD建立定時器和NSTimer定時器

GCD建立定時器和NSTimer定時器

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