@NSManaged 属性 线程安全吗?

Is the @NSManaged property thread safe?

例如在案例中:

@NSManaged public var myProperty: SomeType

func someFunc() {
    concurrentNSManagedObjectContext.perform {
        doSomething(with: self.myProperty)
    }
}

最佳实践是什么?

到目前为止,“线程安全”至少在 Apple 平台上解决了两件事;读写。 NSManaged 对象目前不能防止两者的混合。 func doSomething(...) 如果某个其他线程在突变时正在读取 myProperty,则会抛出异常。突变可以在串行线程上完成,但是线程安全比这更复杂。 someFunc() 被第一个调用者调用;如果该调用者来自并发线程,则无法保证顺序。例如,如果 myProperty 的类型为 Int 并且我从 200 个线程并发调用 someFunc,则最后一个线程可能为 0 而 someFunc 可能为 += 1。现在,如果我将 func 序列化,我的最终输出为 1。所以简短的回答是取决于你想要完成什么。通常你在串行队列上是安全的,但并发需要很多计划。

使用@NSManaged对线程安全没有影响。它帮助 Core Data 管理 属性,但对保持 属性 对线程或其他任何东西的安全没有任何作用。

如果 doSomething 函数与 Core Data 相关,则按原样使用 perform 很好,因为 performperformAndWait 是 Core Data 管理线程安全的方式。访问 performperformAndWait 中的 属性 是安全的;在这些函数之外访问它通常是不安全的。

上述情况的唯一例外是,如果您的托管对象上下文使用主队列并发(例如,如果您使用 NSPersistentContainer 并且上下文是 viewContext 属性) 你确定你的代码在主队列上运行,那么你不需要使用performperformAndWait .在那种情况下使用它们也不错,但也没有必要。