Warm tip: This article is reproduced from serverfault.com, please click

ios-想要保存核心数据,但是“扩展名不能包含存储的属性”

(ios - Want to save Core Data but "Extensions must not contain stored properties")

发布于 2020-11-27 23:04:25

我有一个名为“ CloudPage”的核心数据类,并在我的代码中添加了扩展名:

extension CloudPage:GalleryItem {
    // bunch of methods defined here
    func someFunc() -> Bool {
        return true
    }

对我来说,扩展此类以使所有模型信息都位于此处是很有意义的。我还认为让此类知道如何保存其自身实例是有意义的,因此我在其中添加了viewcontext:

extension CloudPage:GalleryItem {
    @Environment(\.managedObjectContext) private var viewContext

// ...some code...

但是现在swift说“扩展名不能包含存储的属性”。有一个更好的方法吗?我认为所有保存逻辑都应驻留在此模型上。

Questioner
Vlad the Impala
Viewed
12
Deitsch 2020-11-28 08:27:21

正如编译器已经说过的,不允许在Extension中添加存储的属性。CloudPageNSManagedObject,表示它已经由CoreData管理。

无论如何,这不是你使用CoreData Objects的方式。我会澄清一些东西

这些对象是在上下文中管理/加载的。有两种类型的上下文

  1. ViewContext(应用于查看目的)
  2. BackgroundContext(应用于从后台从API加载内容)

如果你更新对象或添加新对象,则这些对象已经存在于上述上下文中。要持久保留这些对象,你不必再像使用普通SQL(UPDATE table...那样将它们“推入”其中你只需要保存上下文,例如

// context is the one you loaded the objects from and worked with
context.save()

希望对你有所帮助,我只是想概括一下,以便你更好地理解。不要绝望,CoreData有它的怪癖,你会习惯的。有关更多详细信息,请参阅Apple使用Core Data的文档