什么是在dispatch_sync之前检查线程是否是主线程?

时间:2014-05-11 06:07:46

标签: objective-c grand-central-dispatch sdwebimage

SDWebImage在其SDWebImageManager的图像下载代码中使用以下代码。为什么有必要检查线程是否是主线程,而不是做任何dispatch_sync?

#define dispatch_main_sync_safe(block)\
    if ([NSThread isMainThread])\
    {\
        block();\
    }\
    else\
    {\
        dispatch_sync(dispatch_get_main_queue(), block);\
    }

1 个答案:

答案 0 :(得分:4)

将块同步分派到当前串行队列会导致立即死锁。 您可以通过在主线程/队列上执行以下代码来轻松验证:

NSLog(@"before");
dispatch_sync(dispatch_get_main_queue(), ^{
    NSLog(@"in block");
});
NSLog(@"after");

因此,如果您事先不知道代码是否会在主线程上调用 或不,检查if ([NSThread isMainThread])是否有意义。 (注意“主线程”和“主队列”实际上是相同的。)

如果使用dispatch_async(),则不会出现此问题。