为什么SDImageCache在init中执行dispatch_sync?

Boo*_*oon 5 objective-c grand-central-dispatch sdwebimage

-[SDImageCache initWithNamespace]执行dispatch_sync分配NSFileManager.dispatch_async在这里做单线的理由或好处是什么?请参阅第78行的完整代码.

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

        dispatch_sync(_ioQueue, ^
        {
            _fileManager = NSFileManager.new;
        });
Run Code Online (Sandbox Code Playgroud)

Rob*_*Rob 5

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

不是使用锁来同步与对象的交互(请参阅" 线程编程指南"的" 同步"部分),可以使用串行队列(请参阅" 并发编程指南"中的"从线程迁移中删除基于锁定的代码"一节) .

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

因此,即使这种分配看起来微不足道,也可能是确保与此对象的所有交互都被分派到此的更广泛努力的一部分_ioQueue,从而实现对象及其执行的所有任务的线程安全同步.

但您可以随时提交问题以确认作者的意图.您可能还想检查"责备"日志,看看是否有提交注释来阐明意图.