通常網(wǎng)上搜到的GCD定時器示例就像如下代碼:
NSTimeInterval period = 0.5;
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
dispatch_source_set_timer(timer, dispatch_walltime(NULL, 0), period * NSEC_PER_SEC, 0);
dispatch_source_set_event_handler(timer, ^{
// 定時執(zhí)行的代碼
});
dispatch_resume(timer);
然而我們像這樣寫好代碼后,運(yùn)行時才發(fā)現(xiàn),定時任務(wù)并沒有像我們想象的那樣執(zhí)行荞下。
原因是我們創(chuàng)建的這個_timer
在這段代碼執(zhí)行完后就被銷毀了犀填,可以看出GCD并沒有管理它的內(nèi)存,并沒有強(qiáng)持有它焰轻,所以我們需要自己想辦法讓它不被銷毀,可以把代碼改成如下方式:
@interface TestViewController ()
@property (nonatomic, strong) dispatch_source_t timer;
@end
NSTimeInterval period = 0.5;
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
_timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
dispatch_source_set_timer(_timer, dispatch_walltime(NULL, 0), period * NSEC_PER_SEC, 0);
dispatch_source_set_event_handler(_timer, ^{
// 定時執(zhí)行的代碼
});
dispatch_resume(_timer);