作为标题,主队列和主线程上的 dispatch_sync()将导致死锁,如下所示:
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"%@", [NSThread currentThread]);
});
但 NSBlockOperation 不会导致死锁:
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"%@", [NSThread currentThread]);
}];
[operation start];
所以,我不明白为什么?这个函数在块完成后才会返回,就像dispatch_sync一样,为什么它不会导致死锁?它们之间的区别是什么?
答案 0 :(得分:1)
您可以阅读here in the official Documentation for NSBlockOperation
:
"添加到块操作的块以默认优先级分派给适当的工作队列。块本身不应该对其执行环境的配置做出任何假设。"
具体来说,这意味着您的块不会在主线程上执行。
对于并发操作(对于NSBlockOperation
都是如此),方法start
以异步方式调度其工作。您应该在日志中看到,您的块不会在主线程上执行。 (注意:您需要确保在执行块之前主线程不会完成才能查看日志。)