1: dispatch_sync 是指在指定 线程队列queue 同步执行任务block,dispatch_sync具有等待block执行结束再能回调的特点;
void
dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
因此,使用dispatch_sync的时候,需要注意啦,不要在当前线程队列,执行block任务,
不然会死锁!!!!dead-lock!!!!!
为什么呢?下面用Viewcontroller具体代码展示 !
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSLog(@"Hello 1");
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"Hello 2");
});
NSLog(@"Hello 3");
}
这个会怎么输出呢?------答案是:Hello 1 ,而且输出这个后,App会进入死锁,任何点击都没响应!
解析:
当代码 在主线程 执行到dispatch_sync块代码(在主线程压入这行代码进行执行),
但是执行这代码,不能马上执行结束回调,而是等待(这行代码继续压在队列中),
然后又在当前队列压入block 任务,而block任务也不能被执行,因为dispatch_sync代码块
先执行(FIFO)且未执行结束,所以block需要等待dispatch_sync,但是dispatch_sync具有等待block执行结束再能回调的特点。
就这样,他们互相等待对方,因此死锁!
因此,不要dispatch_sync把block压入当前队列,对于这样代码,我们可以这样写:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// 这里当前线程是主线程,
dispatch_queue_t myQueue = dispatch_queue_create("MyQueue", NULL);
NSLog(@"Hello 1");
dispatch_sync(myQueue, ^{
NSLog(@"Hello 2");
});
NSLog(@"Hello3");
}
这样就会输出:
Hello 1
Hello 2
Hello 3