GCD定時器要比NSTimer時間準確,為什么?因為NSTimer是受RunLoop模式影響的,但如果設置Track模式,也好使!而GCD是不受RunLoop模式影響的。面試官經常會問什么定時器不準確,怎么辦?
這個不是定時器,這只是延遲調用,執行完后就不做事情了
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"這個不是定時器");
});
定時器,這里有幾個注意點:
- dispatch_source_t 是一個OC對象,所有要強引用
- 雖然是create創建,但這里不用release
- GCD的時間參數是納秒,所有時間特別準
- GCD定時器默認是關閉的
#import "ViewController.h"
@interface ViewController ()
/** 定時器對象(不用帶*,因為dispatch_source_t是個類,內部已經包含了*) */
@property (nonatomic, strong) dispatch_source_t timer;
@end
@implementation ViewController
int count = 0;
- (void)viewDidLoad {
[super viewDidLoad];
// 獲取隊列
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
// 創建一個定時器(dispatch_source_t本質是個oc對象)
self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
// 設置定時器的屬性(幾時開始,每隔多久執行任務)
// GCD的時間參數是納秒(一秒等于十的九次方納秒)
// dispatch_time(DISPATCH_TIME_NOW, 3.0 * NSEC_PER_SEC)比當前時間晚3秒
dispatch_time_t start = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC));
uint64_t end = (uint64_t)(2.0 * NSEC_PER_SEC);
dispatch_source_set_timer(self.timer, start, end, 0);
// 設置回調
dispatch_source_set_event_handler(self.timer, ^{
NSLog(@"--------%@", [NSThread currentThread]);
count ++;
if (count == 10) {
// 取消定時器
dispatch_cancel(self.timer);
self.timer = nil;
}
});
// 開啟定時器
dispatch_resume(self.timer);
}
@end