0

如题,主队列和主线程上的dispatch_sync()会导致死锁,像这样:

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

但是NSBlockOperation不会造成死锁:

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

所以,我不明白为什么?这个函数和dispatch_sync一样直到块完成才返回,那么为什么它不会导致死锁呢?他们之间有什么不同?

4

1 回答 1

1

正如您可以在官方文档中阅读的NSBlockOperation

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

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

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

于 2015-10-16T10:20:49.737 回答