为什么SDImageCache在init中执行dispatch_sync?

时间:2014-05-12 00:39:15

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

-[SDImageCache initWithNamespace]执行dispatch_sync分配NSFileManager。在这里为单行做dispatch_async的理由或好处是什么?请参阅第78行的full code here

        // Init the disk cache
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
        _diskCachePath = [paths[0] stringByAppendingPathComponent:fullNamespace];

        dispatch_sync(_ioQueue, ^
        {
            _fileManager = NSFileManager.new;
        });

1 个答案:

答案 0 :(得分:5)

我无法谈及作者的意图,但这是作为编写线程安全代码的一部分实现对象同步的一个常见模式。

不是使用锁来同步与对象的交互(请参阅线程编程指南Synchronization部分),而是可以使用串行队列(请参阅Eliminating Lock-Based Code 并发编程指南从远程线程迁移一节中的部分。

看一下代码,这似乎是作者的意图(因为看起来与该对象的所有交互都发生在该串行队列上)。假设是这种情况,当使用串行队列来促进同步作为更广泛的线程安全应用程序设计的一部分时,谨慎的做法是将与所讨论的对象的所有交互分派到指定的序列队列,无论调度代码看起来多么微不足道。在所有情况下都可能没有必要这样做,但它具有良好的防御性编程风格,恕我直言。

因此,尽管这种分配看起来微不足道,但它可能是更广泛努力的一部分,以确保将与此对象的所有交互分派到此_ioQueue,从而实现对象和所有任务的线程安全同步它表演。

但您可以随时submit an issue确认作者的意图。您可能还想检查"责备"记录是否有提交注释来阐明意图。