Swift - 懒惰的var线程安全吗?

时间:2015-04-21 02:15:24

标签: ios multithreading swift core-data

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

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

所以我的方法是创建自定义后台线程NSManagedObjectContext,它执行抓取,保存等,同时还创建主线程NSManagedObjectContext,用于从fet {NSManagedObject获取NSManagedObjectId 1}}并将其传递给调用方法。

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

所以我的问题是是否

使用lazy var实例化方法创建NSManagedObjectContext,前提是lazy var为每个尝试访问的线程启动一个对象(不是线程安全的?)

在每个线程中为NSManagedObjectContext声明单独的变量,并使所有与线程相关的方法引用两个不同的NSManagedObjectContext,前提是lazy var是线程安全的(?)并且只创建一次无论线程如何都可以访问它。

提前谢谢!

编辑:任何正在努力解决Core Data并发问题的人,this article列出了一个非常好的设计模式,正如Aaron在下面的评论中所指出的那样!

1 个答案:

答案 0 :(得分:17)

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