swift - 当关系对象的属性发生变化时,让父 NSManagedObject 的 objectWillChange 发送值
问题描述
在 iOS 13 上, aNSManagedObject
会objectWillChange
在其属性更改时发出,但不会通知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 中,我可以手动迭代所有grandParent
并parent
发送通知。但我相信有一个更好的通用解决方案可以使当对象脏时,父对象也会被标记为脏。然后关系中的所有对象将objectWillChange
自动发布。可能吗?
解决方案
objectWillChange
适用于 SwiftUI,要正确执行此操作,您需要学习 KVO:
注册依赖键
在很多情况下,一个属性的值取决于另一个对象中的一个或多个其他属性的值。如果一个属性的值发生变化,那么派生属性的值也应该被标记为变化。如何确保为这些依赖属性发布键值观察通知取决于关系的基数。
推荐阅读
- node.js - 为什么 Promise 返回为
然后? - c++ - char指针不增加?
- spring - spring security - jwt 请求过滤器验证和验证会话,但主体为空
- java - 如何使用 Gradle 设置 JPMS 模块的 ModuleMainClass 属性?
- bash - 在第一次出现字符之前重命名文件名
- android - 为导航充气时由 android.view.InflateException 引起的运行时异常
- python - 如何在 Python 中不使用 math.log 计算对数
- docker - Docker 拒绝在 443 上卷曲
- c - 如何在C中连接vscode中的源文件和头文件
- php - 对数字数组进行排序的函数