我知道这不是一个强有力的问题,但我必须弄清楚这个概念。
我定义了 myBlock
如下。
void(^myBlock)(void) = ^{
for(int i = 0;i < 10 ; i++)
{
NSLog(@"%d and current queue = %@",i,[NSThread currentThread]);
}
};
现在在 viewDidLoad
方法中,当我在主队列上独立使用 dispatch_sync()
方法时,主队列被阻塞。
这是示例。
- (void)viewDidLoad
{
[super viewDidLoad];
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_sync(queue,myBlock);
}
但是但是,当我在主线程上使用相同的 dispatch_sync()
函数时 在并发队列上触发的 dispatch_async()
函数 block 中然后主线程不阻塞。
这是示例。
- (void)viewDidLoad
{
[super viewDidLoad];
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue,^{
dispatch_sync(dispatch_get_main_queue(),myBlock);
});
}
我不清楚为什么会这样?为什么主线程在独立调用dispatch_sync()
时阻塞?
最佳答案
在串行队列(如主队列)上使用 dispatch_sync
时,当前线程必须等待,直到执行分派(dispatch)的代码。
当 block 从串行队列同步分派(dispatch)到同一队列时,会发生死锁。
关于iphone - 为什么对主队列的 dispatch_sync( ) 调用会阻塞主队列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18740872/