也许与其观察潜在的许多键值路径,不如让数组中的每个对象在发生变化时发布通知,然后只需要一个对象观察一个通知而不是一个对象观察许多键值路径。
编辑:
此外,您的数组对象还可以响应名为+keyPathsForValuesAffecting<key>
where <key>
is your key name 的类方法。下面是一个例子:paymentDue
是一个键,当值invoiceItems.count
或paymentsMade
改变时会受到影响。当invoiceItems.count
或paymentsMade
已更改时,任何绑定到paymentDue
的内容都会发送通知。
+ (NSSet *) keyPathsForValuesAffectingPaymentDue:
{
return [NSSet setWithObjects:@"invoiceItems.count", @"paymentMade", nil];
}
如果您在 10.4 上运行,或者以 10.4 或更早版本为目标,则需要改用此方法,但它本质上归结为同一件事。
编辑2:
澄清您的其他评论;您仍然可以手动调用数组中的每个对象
[[NSNotificationCenter defaultCenter] postNotificationName:@"ModelDidChange" object:self];
然后,使用一些控制器代码,您可以注册来自对象的通知更新。如果您选择一个唯一的通知名称,那么您将不需要手动监听特定对象,您可以告诉NSNotificationCenter
他们您想要接收来自任何对象的通知。您的控制器可以很容易地计算出哪个对象发生了变化。
向通知中心注册(这些方法应该在控制器对象中):
// This string could really be just about anything you want, but make it conspicuous.
static NSString * const ModelDidChangeName = @"ModelDidChange";
- (void) awakeFromNib
{
// using nil for the object parameter will make the notification center
// invoke modelDidChange: regardless of who the sender is.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(modelDidChange:) name:ModelDidChangeName object:nil];
}
实现一个方法来处理通知。
- (void) modelDidChange:(NSNotification *) notification
{
MyModelClass *myObject = [notification object];
// do stuff with your model if necessary.
// do stuff with your view too
}
让您的模型对象在部分更改时发布通知:
@implementation MyModelClass
- (void) setSomething:(NSString *) newThing
{
[something autorelease];
something = [newThing copy];
if (something == nil)
{
// special case scenario for when something is nil
// do stuff, modify MyModelClass instance's attributes
[[NSNotificationCenter defaultCenter] postNotificationName:ModelDidChange object:self];
// the controller's modelDidChange: method is automatically invoked.
}
}
@end
但
如果您的模型正确兼容 KVC 并使用适当的 KVO 回调,则不需要手动通知。