【发布时间】:2020-01-23 21:04:42
【问题描述】:
我有一个核心数据模型,其中一个实体生成到类Task 中。我正在尝试从NSManagedObject 获取Combine 发布者objectWillChange 发送(自动,无需手动工作),但它不会。任务实体有一个name 属性。
let task = Task(context: container.viewContext)
let taskSubscription = task.objectWillChange.sink(receiveValue: { _ in
print("Task changed")
})
task.name = "Foo" // WILL NOT trigger
如果我手动调用发送,订阅将起作用:
task.objectWillChange.send() // Will trigger
如果我用简单的ObservableObject 替换它,它将按预期工作:
class DummyTask: ObservableObject {
@Published var name: String?
}
let dummy = DummyTask()
let dummySubscription = dummy.objectWillChange.sink(receiveValue: { _ in
print("Dummy changed")
})
dummy.name = "Foo" // Will trigger
dummy.objectWillChange.send() // Will trigger
NSManagedObject 有问题吗?我应该如何观察一般实体对象的变化?我应该如何让 SwiftUI 看到它们?
这是使用 Xcode 11.0 和 iOS 13。
【问题讨论】:
-
name是否标记为已发布?这通常是我遇到问题的原因。不幸的是,我认为这里没有足够的人来帮助你。 hackingwithswift.com/quick-start/swiftui/… 或 andrewcbancroft.com/blog/ios-development/data-persistence/… 可以帮助你 -
NSManagedObject中的 @MichaelSalmonname是从模型定义生成的。查看生成的 swift 文件时,它是@NSManaged。这里的重点是,尽管两者都是ObservableObjects,但两者的工作方式不同。 -
我刚刚开始使用 Core Data,我还不能说我印象深刻。我还不确定,但在我看来,只有在保存上下文时才会触发更改。要记住的一件事是 ObservableObject 有一个名为 objectWillChange 的发布者,仅此而已。在普通的 OO 中,您添加 \@Published 或编写您自己的等价物,我不知道 \@NSManaged 做了什么,我认为您不应该假定它可以满足您的要求。另一种方法是创建子类文件并修改它们以适应。
-
我已经到了更新核心数据条目的阶段。更新数据很轻松,但要显示更改需要一些时间。最后,我将 Core Data 实例标记为
@ObservedObject并为该实例调用objectWillChange.send()。 -
我看到了完全相同的问题。可悲的是,我的 NSManagedObject 可以通过后台同步刷新,我还没有找到一种方法来完成这项工作。我将继续使用旧的通知。
标签: swift core-data swiftui combine