優點:
*時間準確
*可以使用子線程,解決定時間跑在主線程上卡UI問題
一:需要將dispatch_source_t 設置為成員變量,不然會立即釋放
@implementation ViewController
{
dispatch_source_t _timer;
}
二:創建計時器
- (void)initTimer {
dispatch_queue_t queue = dispatch_get_main_queue();
// 創建一個定時器(dispatch_source_t本質還是個OC對象)
_timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
// 設置定時器的各種屬性(幾時開始任務,每隔多長時間執行一次)
/**
何時開始執行第一個任務 (開始計時時間)
dispatch_time(DISPATCH_TIME_NOW, 1.0 * NSEC_PER_SEC) 比當前時間晚3秒
*/
dispatch_time_t start = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC));
uint64_t interval = (uint64_t)(3.0 * NSEC_PER_SEC);
dispatch_source_set_timer(_timer, start, interval, 0);
// 設置回調
dispatch_source_set_event_handler(_timer, ^{
#warning 是否需要重復計時(默認是重復計時的)
// dispatch_source_cancel(_timer);
dispatch_async(dispatch_get_main_queue(), ^{
[self timerEnd];
});
});
// 啟動定時器 -(可以根據自己的需求,調用此方法)
dispatch_resume(_timer);
}
三:計時結束
- (void)timerEnd {
NSLog(@"計時結束-可以開始自己的任務啦");
}