通常我們在主線程創(chuàng)建timer工育,此外,timer需要結(jié)合runloop才能實現(xiàn)嘱朽。
如果有這樣一個需求搪泳,在非主線程中實現(xiàn)一個timer扼脐。我們可能需要設計一個非主線程,創(chuàng)建它的runloop艰赞。脏榆。比較麻煩。
GCD提供了一個相對優(yōu)雅的做法吁断。參考下面代碼,是一個倒計時的例子:
__blockinttimeout =60;
dispatch_queue_t queue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
//創(chuàng)建一個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);