Swift – 是懒惰的线程安全?
也许这个问题需要一些背景。
我一直在使用Core Data处理持久层,并发现Core Data不是线程安全的,因此NSManagedObjectContext
只能被限制在每个线程中。
所以我的方法是创build自定义后台线程NSManagedObjectContext
执行获取,保存等,同时也创build主线程NSManagedObjectContext
将用于NSManagedObject
获取NSManagedObjectId
并将其传递给调用方法。
默认情况下,Xcode使用lazy var
为所有NSManagedObjectContext
, NSManagedObjectModel
等生成与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
高效。