創(chuàng)建GCD定時器
//創(chuàng)建一個定時器(dispatch_source_t本質(zhì)上還是一個OC對象)
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(0, 0));
dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 3 * NSEC_PER_SEC, 0 * NSEC_PER_SEC);
dispatch_source_set_event_handler(timer, ^{
NSLog(@"執(zhí)行定時任務(wù)----");
});
_timer = timer;
//啟動定時器(默認(rèn)是暫停)
dispatch_resume(timer);
注意:默認(rèn)創(chuàng)建的定時器對象需要強引用保住它的命,在任務(wù)執(zhí)行中不被釋放
定時器操作函數(shù)
dispatch_suspend 是將定時器暫停
dispatch_resume 是恢復(fù)定時器结借。
dispatch_source_cancel 是取消定時器
以下條件奔潰
- remuse(恢復(fù))的狀態(tài)下剩膘,如果再進(jìn)行一次resume(恢復(fù))就會crash,所以要注冊一個BOOL值的狀態(tài)進(jìn)行記錄履因,防止多次suspend和resume引起閃退类咧。
- 在suspend(暫停)的狀態(tài)下馒铃,如果你設(shè)置_timer = nil就會crash
官方注釋
Calls to dispatch_suspend() must be balanced with calls to dispatch_resume().