iOS-GCD中Timer操作

对于主线程,因为一开始就启动了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
2
3
4
5
6
7
 - (void)cancelTimer:(dispatch_source_t)timer
{
if(timer != nil){
dispatch_source_cancel(timer);
timer = nil;
}
}

如果需要设置重复,只需要将:

DISPATCH_TIME_FOREVER

改成:

间隔时间 * NSEC_PER_SEC

即可。