2014-05-11 41 views
4

SDWebImage在其SDWebImageManager的图像下载代码中使用以下代码。为什么有必要检查线程是否是主线程,而不是不管dispatch_sync如何?在dispatch_sync之前需要检查一个线程是否是主线程?

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

它可能不是。 – matt

+0

@matt,因为这是同步呼叫,所以至关重要。正如Martin指出的那样,如果你从主线程向主队列发送'dispatch_sync',应用程序将会死锁! – Rob

+0

@Rob我想到了,但后来我无法相信会发生这种情况... – matt

回答

4

调度块同步到当前串行队列中立即死锁结果。 您可以通过执行以下代码在主线程/队列验证容易:

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

因此,如果你事先不知道的代码将被称为主线程 上与否,有意义检查if ([NSThread isMainThread])。 (请注意,“主线程”和“主队列”实际上是相同的。)

如果使用dispatch_async(),则不会发生此问题。

+0

请你解释为什么SDWebImage使用dispatch_sync而不是dispatch_async? – keywind

相关问题