今天看MBProgressHUD 里面的源代码看到了GCD的应用,结合android Handler和Looper 写了一个很简单的测试程序,以后再详细总结:
这是一个UILabel 模拟简单的秒表
dispatch_async(dispatch_get_global_queue(0, 0), ^{
while(YES){
sleep(1);
//方案1:
dispatch_async(dispatch_get_main_queue(), ^{
static int count =1;
[self.value setText:[NSString stringWithFormat:@"value = %d",count]];
count++;
});
//方案二:
// [self performSelectorOnMainThread:@selector(updateValue:) withObject:self waitUntilDone:0];
//方案三:
// static int count =1;
// [self.value setText:[NSString stringWithFormat:@"value = %d",count]];
// count++;
}
方案一和方案二均可以正常运行,方案三运行没由任何结果,也没有crash。
结论是:
dispatch_get_global_queue(0, 0) 是一个工作线程,由系统管理的一个concurrent(并发)pool或队列。
dispatch_async 中传入 dispatch_get_main_queue() (UI线程)相当与把代码快抛进UI线程里面。
[self performSelectorOnMainThread:@selector(updateValue:) withObject:self waitUntilDone:0]; 这个就不必说了,android中也由Activity、handler都有类似的代码,相当于把一个Runnable对象抛到UI线程队列里面。
GCD挺有意思的。
下面是sdk中的一些定义:
typedef void (^dispatch_block_t)(void);
void dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
得到queue的其中一个方法(也可以自己建一个工作队列,一般用global即可):
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);