Я не на 100%, но я уверен, что Наблюдение значения ключа - это то, что вы хотите.
Какой бы объект ни заботился о массиве, он регистрируется как наблюдатель:
[objectWithArray addObserver:self
forKeyPath:@"theArray"
options:NSKeyValueObservingOptionNew
context:nil];
Затем он получит уведомление об изменении массива:
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context {
NSLog(@"Change is good: %@", [change objectForKey:NSKeyValueChangeNewKey]);
}
Обратите внимание, что этот единственный метод будет собирать все наблюдения, для которых этот объект зарегистрирован. Если вы зарегистрируете один и тот же объект для наблюдения множества разных ключей, вам, вероятно, придется различать их при вызове этого метода; это цель аргументов keyPath
и object
.
Проблема, и причина, по которой я не уверен, сработает ли это для вас, заключается в том, что это предполагает, что массив находится в вашем коде, потому что вам нужно обернуть доступ к нему для отправки уведомления.
[self willChangeValueForKey:@"theArray"];
[theArray addObject:...];
[self didChangeValueForKey:@"theArray"];
Произвольный каркасный класс будет иметь некоторые свойства, а некоторые свойства не совместимы с наблюдением значения ключа. Например, NSWindow
s firstResponder
соответствует KVO, но его childWindows
нет. Документы, конечно, скажут вам, какие есть какие.