ios - 如果我通过 KVO 观察集合,我是否会收到集合内对象发生更改的通知?

标签 ios objective-c cocoa-touch key-value-observing

我假设不是,但总是喜欢仔细检查。

假设我有一个正在 KVObserving 的 NSMutableArray。它拥有一堆 Employee 对象。如果我完全分配数组,那么毫无疑问我会观察到变化。但是,如果我更改数组中的 Employee 对象引用/值/对象之一,例如 employee.salary,会怎样?

我假设没有 KVO 通知,这里正确吗?

如果你曾经想要这样的东西,它会如何实现?

最佳答案

一个快速的挑剔:你不能以键值方式观察 NSMutableArray。这不是 KVO 所做的。您正在做的是键值观察某个对象的某些属性(例如“员工”)。该属性可以被键入为 NSMutableArray(尽管这是一个糟糕的想法),或者仅仅由 NSMutableArray 支持。但你没有观察数组​​。您正在观察对象的 employees 属性的变化。

观察集合属性的键值不会观察集合中对象的属性。一般来说,没有办法全面观察任何对象的所有属性。

如果您想观察集合中对象的某些特定属性或属性,您应该:

  1. 将该集合的所有突变合并到单独的方法中。您应该已经完成​​此操作,以使您的 employees 属性符合 KVO 标准。特别是,我建议您实现索引集合变异访问器。
  2. 在这些方法中,使用 -addObserver:toObjectsAtIndexes:forKeyPath:options:context:-removeObserver:fromObjectsAtIndexes:forKeyPath:context: 开始和停止观察某些关键点添加到集合或从集合中删除的元素的路径。您还需要在 employees 属性的 setter (-setEmployees:) 中执行此操作(停止观察旧数组的所有元素,将其替换为新数组)数组,开始观察新数组的所有元素)。
  3. 不要忘记在释放数组之前停止观察元素,例如在 -dealloc 中。

关于ios - 如果我通过 KVO 观察集合,我是否会收到集合内对象发生更改的通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35617262/

相关文章:

ios - 无法转换 UITableViewCell 类型的值

ios - 真的没有办法从照片库中检索照片的原始文件名吗?

ios - PerformBatchUpdates 中的 reloadData :completion: does not call cellForItemAtIndexPath:

objective-c - CoreGraphics Quartz 在透明 alpha 路径上绘制阴影

ios - 如何根据文本缩小/扩展 View 高度

objective-c - 我可以在 MKMapView 中更改 Google Logo 的位置吗?

ios - 在 UI 上调用事件方法

ios - 如何为单独的 Accordion 表格 View 父单元格和子单元格创建单独的 UI 对象?

ios - 带有水平分页的 UIScrollView 不居中 subview

iphone - MFMailComposer 在附件图片后放置感谢、问候文本