为什么主线程上的dispatch_sync导致死锁但NSBlockOperation不会?

时间:2015-08-03 16:28:26

标签: grand-central-dispatch nsoperation nsoperationqueue dispatch nsblockoperation

作为标题,主队列和主线程上的 dispatch_sync()将导致死锁,如下所示:

dispatch_sync(dispatch_get_main_queue(), ^{
    NSLog(@"%@", [NSThread currentThread]);
});

NSBlockOperation 不会导致死锁:

NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"%@", [NSThread currentThread]);
}];
[operation start];

所以,我不明白为什么?这个函数在块完成后才会返回,就像dispatch_sync一样,为什么它不会导致死锁?它们之间的区别是什么?

1 个答案:

答案 0 :(得分:1)

您可以阅读here in the official Documentation for NSBlockOperation

"添加到块操作的块以默认优先级分派给适当的工作队列。块本身不应该对其执行环境的配置做出任何假设。"

具体来说,这意味着您的块不会在主线程上执行。

对于并发操作(对于NSBlockOperation都是如此),方法start以异步方式调度其工作。您应该在日志中看到,您的块不会在主线程上执行。 (注意:您需要确保在执行块之前主线程不会完成才能查看日志。)