GCD相比NSOperation,无法cancel正在进行的线程。
GCD用不好会造成死锁。
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"=================1");
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"=================2");
});
NSLog(@"=================3");
}
dispatch_sync 函数不会立即返回,会阻塞当前线程,等待 block同步执行完成。而且它是在主线程上,所以block和主线程互相等待。
int count = 0;
do {
NSLog(@"1");
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"2");
});
NSLog(@"3");
count ++;
}while (count < 100);
while(1);//注释掉这句就不会死锁
2永远不会被打印,主线程被阻塞了,dispatch_async 函数会立即返回, block会在后台异步执行,如果没有while(1)阻塞主线程的话不会造成死锁。
总的来说,GCD中全局队列属于并行队列,里面可以有多个字线程运行。主队列是串行队列,一个一个操作挨个之行,这种情况下入如果循环等待那么就会死锁。
do {
NSLog(@"1");
dispatch_async(dispatch_get_global_queue(0, 0), ^{ NSLog(@"4");
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"2");
});
});
NSLog(@"3");
count ++;
}while (count < 100);
打印结果是1 43 134(3 4不确定顺序) 2是最后打印的,