Может быть, вместо того, чтобы наблюдать потенциально много путей значений ключей, почему бы не каждому объекту в массиве публиковать уведомление, когда что-то изменилось, тогда только одному объекту нужно наблюдать одно уведомление вместо одного объекта, наблюдающего множество путей значений ключей.
EDIT:
Кроме того, ваши массированные объекты могут также отвечать на метод класса с именем +keyPathsForValuesAffecting<key>
, где <key>
- это имя вашего ключа. Вот пример: 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, ручные уведомления не требуются.