安全关键值观察关键path
我正试图在keypaths上实现一个安全的key值。 假设我有一个名为person
的数据模型对象,它具有workplace
属性。 workplace
又有一个address
属性,我希望遵守,所以我build立了关键的价值观观,以下呼吁:
[person addObserver:theObserver forKeyPath:@"workplace.address" options:NSKeyValueObservingOptionNew context:NULL];
这工作正常,直到人不换工作场所。 一旦发生这种情况:
person.workplace = newWorkplace;
KVC系统正确地崩溃了应用程序,说“oldAddress被释放,而关键值观察者仍然注册”。 (旧地址是以前工作地点的地址)。
不幸的是,我不能调整“人”对象类的实现来通知观察者工作场所将要消失。 有没有什么模式可以避免这种崩溃? 也许可以得到一些其他的通知? 在KVC的情况下,keypath是如何遍历的,你是否可以访问这个链?
编辑2
花了一些时间与KVO后,我发现你的情况,你应该观察person.workplace.address
而不是workplace.address
。 当你观察person.workplace.address
,你实现了两件事:
1)由于您拥有person
对象,因此您可以绝对控制对象的生命周期。 您现在可以在您自己select的时间移除Observer。
2)当workplace
对象改变时,KVO机制将“自动”观察新workplace
的新address
。 当然,它会通知你新的address
。
现在,您可以随时观察address
而不用担心workplace
被更换。 这是KVO真正隐藏的力量之一。 这允许子类在不知道其生命周期的情况下安全地观察任何超类的对象。
编辑1
将KVO属性的对象作为观察者移除的最佳做法
在这个线程接受的答案最好地描述你的情况。 你不应该首先观察房产address
,因为你无法控制workplace
的生命周期。 你有一个devise问题。
原版的
您可以观察person对象上的keyPath workplace
。 当这个keyPath被调用时,你只需删除observer for workplace.address
。
[person addObserver:theObserver forKeyPath:@“workplace”选项:[NSKeyValueObservingOptionNew] context:NULL];
- 核心数据:发送KVO通知,以获取瞬态派生属性
- 简单types(非NSObject)上的KVO(IOS 5)
- 简单的KVO例子
- 这个observeValueForKeyPath有什么问题:ofObject:change:context:implementation?
- 在Swift的计算属性上的KVO
- NSManagedObject属性数组
- UIWindow RootViewController更改SWIFT时触发事件/方法
- 键值在Swift中观察不显示数组中的插入和删除
- 什么时候应该从closures的ViewController类中观察持续的Model类调用removeObserver:forKeyPath?