想要保存核心数据,但“扩展不得包含存储的属性”
Posted
技术标签:
【中文标题】想要保存核心数据,但“扩展不得包含存储的属性”【英文标题】: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 说“扩展不能包含存储的属性”。有一个更好的方法吗?我认为所有的保存逻辑都应该驻留在这个模型上。
【问题讨论】:
【参考方案1】:正如编译器已经说过的,不允许在扩展中添加存储属性。 CloudPage
是 NSManagedObject
,这意味着它已经由 CoreData 管理。
无论如何这不是您使用 CoreData 对象的方式。我会澄清一些事情
这些对象在上下文中管理/加载。有两种类型的上下文
-
ViewContext(应该用于查看目的)
BackgroundContext(应该用于从例如后台的 API 加载内容)
如果您更新对象或添加新对象,这些对象已经存在于所述上下文中。要持久保存这些对象,您不必再像使用普通 SQL (UPDATE table...
) 那样将它们“推”入其中。你只需要像
// context is the one you loaded the objects from and worked with
context.save()
希望对你有所帮助,我只是想粗略地总结一下,以便你更好地理解。不要绝望,CoreData 有它的怪癖,你会习惯的。更多详情请阅读Apples Documentation of working with Core Data。
【讨论】:
以上是关于想要保存核心数据,但“扩展不得包含存储的属性”的主要内容,如果未能解决你的问题,请参考以下文章