GCD对timer的一种实现

2017-09-14  本文已影响18人  lzh_coder

通常我们在主线程创建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);

上一篇 下一篇

猜你喜欢

热点阅读