SDWebImage在其SDWebImageManager的图像下载代码中使用以下代码。为什么有必要检查线程是否是主线程,而不是做任何dispatch_sync?
#define dispatch_main_sync_safe(block)\
if ([NSThread isMainThread])\
{\
block();\
}\
else\
{\
dispatch_sync(dispatch_get_main_queue(), block);\
}
答案 0 :(得分:4)
将块同步分派到当前串行队列会导致立即死锁。 您可以通过在主线程/队列上执行以下代码来轻松验证:
NSLog(@"before");
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"in block");
});
NSLog(@"after");
因此,如果您事先不知道代码是否会在主线程上调用
或不,检查if ([NSThread isMainThread])
是否有意义。 (注意“主线程”和“主队列”实际上是相同的。)
如果使用dispatch_async()
,则不会出现此问题。