我假设不是,但总是喜欢仔细检查。
假设我有一个正在 KVObserving 的 NSMutableArray。它拥有一堆 Employee 对象。如果我完全分配数组,那么毫无疑问我会观察到变化。但是,如果我更改数组中的 Employee 对象引用/值/对象之一,例如 employee.salary,会怎样?
我假设没有 KVO 通知,这里正确吗?
如果你曾经想要这样的东西,它会如何实现?
最佳答案
一个快速的挑剔:你不能以键值方式观察 NSMutableArray
。这不是 KVO 所做的。您正在做的是键值观察某个对象的某些属性(例如“员工”)。该属性可以被键入为 NSMutableArray(尽管这是一个糟糕的想法),或者仅仅由 NSMutableArray 支持。但你没有观察数组。您正在观察对象的 employees
属性的变化。
观察集合属性的键值不会观察集合中对象的属性。一般来说,没有办法全面观察任何对象的所有属性。
如果您想观察集合中对象的某些特定属性或属性,您应该:
- 将该集合的所有突变合并到单独的方法中。您应该已经完成此操作,以使您的
employees
属性符合 KVO 标准。特别是,我建议您实现索引集合变异访问器。 - 在这些方法中,使用
-addObserver:toObjectsAtIndexes:forKeyPath:options:context:
和-removeObserver:fromObjectsAtIndexes:forKeyPath:context:
开始和停止观察某些关键点添加到集合或从集合中删除的元素的路径。您还需要在employees
属性的 setter (-setEmployees:
) 中执行此操作(停止观察旧数组的所有元素,将其替换为新数组)数组,开始观察新数组的所有元素)。 - 不要忘记在释放数组之前停止观察元素,例如在
-dealloc
中。
关于ios - 如果我通过 KVO 观察集合,我是否会收到集合内对象发生更改的通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35617262/