首页 > 解决方案 > 当关系对象的属性发生变化时,让父 NSManagedObject 的 objectWillChange 发送值

问题描述

在 iOS 13 上, aNSManagedObjectobjectWillChange在其属性更改时发出,但不会通知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自动发布。可能吗?

标签: swiftcore-datacombine

解决方案


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

注册依赖键

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

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


推荐阅读