【问题标题】:Let parent NSManagedObject's objectWillChange send value when relation object's property changed当关系对象的属性发生变化时,让父 NSManagedObject 的 objectWillChange 发送值
【发布时间】:2020-03-29 19:12:14
【问题描述】:

在 iOS 13 上,NSManagedObjectobjectWillChange 将在其属性更改时发出,但不会通知关系中的另一个 NSManagedObject

我的临时解决方法如下:

class Child: NSManagedObject {

    @NSManaged var parent: Parent?

    override func willSave() {
        super.willSave()
        if isUpdated {
            parent?.objectWillChange.send()
        }
    }
}

这行得通。但在我的情况下,模型更复杂:

class Child: NSManagedObject {

    @NSManaged var parent: Parent?

    override func willSave() {
        super.willSave()
        if isUpdated {
            parent?.objectWillChange.send()
            // NOTE
            // how to let grandParents objectWillChange also omit? 
        }
    }
}

class Parent: NSManagedObject {

    @NSManaged var grandParents: Set<GrandParent>

    override func willSave() {
        super.willSave()
        // call grandParents forEach objectWillChange.send() if isUpdated
    }
}

在 NOTE 时,我可以迭代所有 grandParentparent 并手动发送通知。但我相信有一个更好的通用解决方案可以使当对象脏时,父对象也会被标记为脏。然后关系中的所有对象将自动发布objectWillChange。有可能吗?

【问题讨论】:

  • 我假设您使用的是 SwiftUI。您能否将单独的 @ObservedObject 添加到您希望视图依赖的每个 NSManagedObject,以便 SwifUI 可以在观察到的对象更改时自动更新视图。

标签: swift core-data combine


【解决方案1】:

objectWillChange 用于 SwiftUI,要正确执行此操作,您需要学习 KVO:

注册依赖键

在很多情况下,一个属性的值取决于另一个对象中一个或多个其他属性的值。如果一个属性的值发生更改,则派生属性的值也应标记为更改。如何确保为这些依赖属性发布键值观察通知取决于关系的基数。

https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/KeyValueObserving/Articles/KVODependentKeys.html#//apple_ref/doc/uid/20002179-BAJEAIEE

【讨论】:

    最近更新 更多