也许这个问题需要一些背景。
我一直在使用Core Data处理我的持久层,发现Core Data不是线程安全的,因此只需将NSManagedObjectContext
限制在每个线程中。
所以我的方法是创建自定义后台线程NSManagedObjectContext
,它执行抓取,保存等,同时还创建主线程NSManagedObjectContext
,用于从fet {NSManagedObject
获取NSManagedObjectId
1}}并将其传递给调用方法。
默认情况下,Xcode使用lazy var
为所有NSManagedObjectContext
,NSManagedObjectModel
等生成与核心数据相关的模板代码。
所以我的问题是是否
使用lazy var
实例化方法创建NSManagedObjectContext
,前提是lazy var
为每个尝试访问的线程启动一个对象(不是线程安全的?)
或
在每个线程中为NSManagedObjectContext
声明单独的变量,并使所有与线程相关的方法引用两个不同的NSManagedObjectContext
,前提是lazy var
是线程安全的(?)并且只创建一次无论线程如何都可以访问它。
提前谢谢!
编辑:任何正在努力解决Core Data并发问题的人,this article列出了一个非常好的设计模式,正如Aaron在下面的评论中所指出的那样!
答案 0 :(得分:17)
lazy var
不是线程安全的。您可以使用dispatch_once
,常量(let
)或嵌套结构模式(通常用于单例)来确保线程安全。您也可以使用NSRecursiveLock
使用自己的锁定,但这可能不如dispatch_once
有效。