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

Dan*_*hin 6 multithreading core-data ios swift

也许这个问题需要一些背景知识.

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

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

默认情况下,Xcode的生成与核心数据模板的代码中使用lazy var的所有NSManagedObjectContext,NSManagedObjectModel等等.

所以我的问题是,是否

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

要么

NSManagedObjectContext在每个线程中声明单独的变量,并使所有与线程相关的方法引用两个不同的方法,NSManagedObjectContext这些方法lazy var是线程安全的(?),并且在访问它时只创建一次,而不管线程如何.

先感谢您!

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

Aar*_*ger 18

lazy var不是线程安全的.您可以使用dispatch_onceconstant(let)或嵌套结构模式(通常用于单例)来实现线程安全.您也可以使用自己的锁定,NSRecursiveLock但这可能没有那么高效dispatch_once.

  • @AaronBrager尽管如此,dispatch_once使用静态谓词,因此每个应用程序的生命周期都会运行一次.如果lazy var是一个实例变量,您可能希望使用您提到的其他锁定技术或调度信号量. (3认同)