GCD对timer的一种实现

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容