对于主线程,因为一开始就启动了RunLoop,所以可以直接用NSTimer,但对于其他自己创建的线程,或者在GCD中,没有启动RunLoop的,NSTimer将不会延时或者重复启用。
解决办法(1):
//利用dispatch_time_t
dispatch_time_t time=dispatch_time(DISPATCH_TIME_NOW, 5ull *NSEC_PER_SEC);
dispatch_after(time, queue, ^{
// 超过5秒
Do something..
});
这种方法的弊端是,无法取消。
解决办法(2):
//利用dispatch_source_t
_requestTrackListTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
dispatch_source_set_timer(_requestTrackListTimer, dispatch_time(DISPATCH_TIME_NOW, 5 * NSEC_PER_SEC), DISPATCH_TIME_FOREVER, 0.1 * NSEC_PER_SEC);
dispatch_source_set_event_handler(_requestTrackListTimer, ^{
// 超过5秒
Do something..
});
dispatch_resume(_requestTrackListTimer);
这种方法,可以取消:
1 | - (void)cancelTimer:(dispatch_source_t)timer |
如果需要设置重复,只需要将:
DISPATCH_TIME_FOREVER
改成:
间隔时间 * NSEC_PER_SEC
即可。