也许这个问题需要一些上下文。
我一直在使用Core Data在持久层上进行工作,发现Core Data不是线程安全的,因此仅需要NSManagedObjectContext限制在每个线程中。
NSManagedObjectContext
因此,我的方法是创建自定义后台线程NSManagedObjectContext,以执行获取,保存等操作,同时还要创建主线程NSManagedObjectContext,该线程将用于NSManagedObject从获取的线程中获取NSManagedObjectId并将其传递给调用者方法。
NSManagedObject
NSManagedObjectId
默认情况下,Xcode的生成与核心数据模板的代码中使用lazy var的所有NSManagedObjectContext,NSManagedObjectModel等等。
lazy var
NSManagedObjectModel
所以我的问题是是否
使用lazy var实例化方法来创建NSManagedObjectContext,前提是lazy var为每个尝试访问的线程初始化一个对象(不是线程安全的吗?)
要么
NSManagedObjectContext在每个线程中声明单独的变量,并使所有与线程相关的方法引用两个不同的变量NSManagedObjectContext,它们lazy var是线程安全的(?),并且在访问该线程时与线程无关仅创建一次。
先感谢您!
编辑:任何在Core Data并发问题上苦苦挣扎的人,本文都会列出一个非常好的设计模式,正如Aaron在下面的评论中指出的那样!
从Swift编程语言:属性:
如果lazy多个线程同时访问带有修饰符的属性,并且该属性尚未初始化,则不能保证该属性仅被初始化一次。
lazy
lazy var不是线程安全的。您可以使用
dispatch_once
let
为了线程安全。
您还可以使用使用自己的锁定,NSRecursiveLock但是效率可能不如dispatch_once。
NSRecursiveLock