通常我们在主线程创建timer,此外,timer需要结合runloop才能实现。
如果有这样一个需求,在非主线程中实现一个timer。我们可能需要设计一个非主线程,创建它的runloop。。比较麻烦。
GCD提供了一个相对优雅的做法。参考下面代码,是一个倒计时的例子:
__blockinttimeout =60;
dispatch_queue_t queue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
//创建一个timer的source。
dispatch_source_t _timer =dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER,0,0,queue);
dispatch_source_set_timer(_timer,dispatch_walltime(NULL,0),1.0*NSEC_PER_SEC,0);
WeakSelf
dispatch_source_set_event_handler(_timer, ^{
StrongSelf
if(timeout==0){
dispatch_source_cancel(_timer);
dispatch_async(dispatch_get_main_queue(), ^{
//更新UI
});
}else{
int seconds = timeout %61;
NSString*strTime = [NSStringstringWithFormat:@"%.2d秒", seconds];
dispatch_async(dispatch_get_main_queue(), ^{
//更新主线程UI。
});
timeout--;
}
});
dispatch_resume(_timer);
网友评论