Objective c 为什么SDImageCache在init中执行dispatch_sync?

Objective c 为什么SDImageCache在init中执行dispatch_sync?,objective-c,grand-central-dispatch,sdwebimage,Objective C,Grand Central Dispatch,Sdwebimage,-[SDImageCache initWithNamespace]执行dispatch\u sync以分配NSFileManager。在这里,对一行程序执行dispatch\u async的基本原理或好处是什么?见第78行 // Init the disk cache NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);

-[SDImageCache initWithNamespace]
执行
dispatch\u sync
以分配
NSFileManager
。在这里,对一行程序执行
dispatch\u async
的基本原理或好处是什么?见第78行

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

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

我不能说出作者的意图,但这是实现对象同步的一种常见模式,也是编写线程安全代码的一部分

可以使用串行队列,而不是使用锁来同步与对象的交互(请参阅《线程编程指南》的一节),而可以使用串行队列(请参阅《并发编程指南》的“从线程迁移”一章中的一节)

浏览一下代码,这似乎是作者的意图(因为与此对象的所有交互似乎都发生在该串行队列上)。假设是这种情况,当使用串行队列作为更广泛的线程安全应用程序设计的一部分来促进同步时,谨慎的做法是将与相关对象的所有交互分派到指定的串行队列,而不管分派的代码看起来有多微不足道。在所有情况下,这可能不是严格必要的,但这是一种很好的防御性编程风格,IMHO

因此,尽管此分配看起来微不足道,但它可能是更广泛工作的一部分,以确保与此对象的所有交互都被分派到此
\u ioQueue
,从而实现对象及其执行的所有任务的线程安全同步


但你可以随时确认作者的意图。您可能还希望检查“责备”日志,以查看是否有说明意图的提交注释

我不明白这有什么意义。尤其是因为它所做的只是创建一个私有的
NSFileManager
。似乎毫无意义。问作者为什么。这里最愚蠢的部分是这个
dispatch\u sync
在init方法中。在常见情况下,由于对象还不能被任何其他对象或线程引用,因此在init方法返回之前,线程安全是“有保证的”。在过去的几年中,这可能表明作者相信,
NSFileManager
与创建它的队列有某种关联,但到目前为止,我们知道它实际上无法有意义地发现创建它的队列,所以这也是一种误导。如果这是意图的信号,那么发表评论可能是更好的方式。