Swift – 是懒惰的线程安全?

也许这个问题需要一些背景。

我一直在使用Core Data处理持久层,并发现Core Data不是线程安全的,因此NSManagedObjectContext只能被限制在每个线程中。

所以我的方法是创build自定义后台线程NSManagedObjectContext执行获取,保存等,同时也创build主线程NSManagedObjectContext将用于NSManagedObject获取NSManagedObjectId并将其传递给调用方法。

默认情况下,Xcode使用lazy var为所有NSManagedObjectContextNSManagedObjectModel等生成与Core Data相关的模板代码。

所以我的问题是是否要

使用lazy var实例化方法来创buildNSManagedObjectContext ,只要lazy var为每个试图访问的线程启动一个对象(不是线程安全的?)

要么

在每个线程中为NSManagedObjectContext声明单独的variables,并使所有线程相关的方法引用两个不同的NSManagedObjectContext前提是lazy var是线程安全的(?),并且在被访问时只创build一次而不pipe线程。

先谢谢你!

编辑:任何正在为核心数据并发问题而苦恼的人, 本文列出了一个非常好的devise模式,正如Aaron在下面的评论中指出的那样!

lazy var不是线程安全的。 您可以使用dispatch_once ,常量( let )或嵌套的结构模式(通常用于单例)来实现线程安全。 你也可以使用自己的locking使用NSRecursiveLock但这可能不如dispatch_once高效。