Ответ 1
Вы не должны вызывать [super observeValueForKeyPath:ofObject:change:context:]
, если вы обрабатываете уведомление. Вы должны вызывать это только для уведомлений, которые вы сами не используете.
Я получаю следующее в своем окне вывода при запуске проекта:
An -observeValueForKeyPath:ofObject:change:context: message was received but not handled.
Key path: connection.messageQueue
Observed object: <Client: 0x10011ddb0>
...
Вы получаете идею. Дело в том, что я не знаю, почему это происходит. Однако все работает отлично. Вот код, вызывающий проблему:
-(id) initWithIdentifier:(NSString*)ident andClient:(Client*)chatClient {
if(![super initWithNibName:@"ChatView" bundle:nil]) {
return nil;
}
[self setTitle: ident];
client = chatClient;
[self setIdentifier:ident];
inContext = false;
[client addObserver:self forKeyPath:@"connection.messageQueue" options:NSKeyValueObservingOptionNew context:NULL];
return self;
}
-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
NSAttributedString* rar = [[NSAttributedString alloc] initWithString:@"test"];
[[textView textStorage] appendAttributedString:rar];
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
Я думал, что покажу весь код, относящийся к этому. У класса только несколько методов, так что это все, что вам нужно увидеть. Я даже не использую это изменение, я просто набрасываю "тест", когда происходит событие KVO.
Трассировка стека становится очень большой, поскольку сообщения поступают все время. Тем не менее, похоже, что все работает нормально.
Любые подсказки?
Вы не должны вызывать [super observeValueForKeyPath:ofObject:change:context:]
, если вы обрабатываете уведомление. Вы должны вызывать это только для уведомлений, которые вы сами не используете.
У меня такая же проблема: An -observeValueForKeyPath: ofObject: change: context: сообщение получено, но не обработано. У меня есть googled здесь, тогда я сам это понял, так что, возможно, это помогает кому-то.
Для меня проблема заключалась в том, что объект зарегистрирован как наблюдатель (если у вас есть ... addObserver: self..., то этот объект self) имеет был выпущен в тот момент, когда значение было изменено. Но наблюдатель все еще был зарегистрирован, поэтому сообщение -observeValueForKeyPath:ofObject:change:context:
было получено наблюдателем nil.