小编典典

Swift-惰性var线程安全吗?

swift

也许这个问题需要一些上下文。

我一直在使用Core Data在持久层上进行工作,发现Core
Data不是线程安全的,因此仅需要NSManagedObjectContext限制在每个线程中。

因此,我的方法是创建自定义后台线程NSManagedObjectContext,以执行获取,保存等操作,同时还要创建主线程NSManagedObjectContext,该线程将用于NSManagedObject从获取的线程中获取NSManagedObjectId并将其传递给调用者方法。

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

所以我的问题是是否

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

要么

NSManagedObjectContext在每个线程中声明单独的变量,并使所有与线程相关的方法引用两个不同的变量NSManagedObjectContext,它们lazy var是线程安全的(?),并且在访问该线程时与线程无关仅创建一次。

先感谢您!

编辑:任何在Core Data并发问题上苦苦挣扎的人,本文都会列出一个非常好的设计模式,正如Aaron在下面的评论中指出的那样!


阅读 627

收藏
2020-07-07

共1个答案

小编典典

Swift编程语言:属性

如果lazy多个线程同时访问带有修饰符的属性,并且该属性尚未初始化,则不能保证该属性仅被初始化一次。

lazy var不是线程安全的。您可以使用

  • dispatch_once (在应用的整个生命周期内运行一次)
  • 常数(let
  • 嵌套的struct模式(通常用于单例)

为了线程安全。

您还可以使用使用自己的锁定,NSRecursiveLock但是效率可能不如dispatch_once

2020-07-07