ios - 再细读KVO

[罗国强原创]

KVO - Key-Value Observing. 它提供了一种机制,允许对象被通知到其他对象的具体特性的变化。它特别适用于一个应用的模型层与控制层的交互。

一种典型的应用场景是在一个视图控制器里面,一个视图观察一个模型对象的属性。一个模型对象可以观察其它模型对象甚至它自己。

KVO也分2种,一种是自动的KVO,一种是手动的KVO。

NSObject自动支持KVO特性并且默认情况下一个类的属性支持kvc都可以使用。如果你遵循标准的Cocoa编码和命名规则,你可以使用自动更改通知你不需要写任何额外的代码。手动更改通知提供额外的控制时发出的通知,并要求额外的编码。你可以通过类的方法automaticallynotifiesobserversforkey:控制您的类属性自动通知。

自动模式的KVO

NSObject提供了基本的自动键-值改变通知。

手动模式的KVO

实现手动通知的对象必须实现 automaticallyNotifiesObserversForKey 方法。为了实现手动观察消息,你必须在改变值之前调用 willChangeValueForKey: ,改变值之后调用 didChangeValueForKey:

在我们注册键-值的时候,有2种情况:

1)1对1关系

To trigger notifications automatically for a to-one relationship you should either override keyPathsForValuesAffectingValueForKey: or implement a suitable method that follows the pattern it defines for registering dependent keys.

2)1对多关系

The keyPathsForValuesAffectingValueForKey: method does not support key-paths that include a to-many relationship. For example, suppose you have a Department object with a to-many relationship (employees) to a Employee, and Employee has a salary attribute. You might want the Department object have a totalSalary attribute that is dependent upon the salaries of all the Employees in the relationship. You can not do this with, for example, keyPathsForValuesAffectingTotalSalary and returning employees.salary as a key.

上一篇:VS项目中使用Nuget还原包后编译生产还一直报错?


下一篇:MYSQL 不排序