"сообщение получено, но не обработано" KVO

Я получаю следующее в своем окне вывода при запуске проекта:

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.

Трассировка стека становится очень большой, поскольку сообщения поступают все время. Тем не менее, похоже, что все работает нормально.

Любые подсказки?

Ответы

Ответ 1

Вы не должны вызывать [super observeValueForKeyPath:ofObject:change:context:], если вы обрабатываете уведомление. Вы должны вызывать это только для уведомлений, которые вы сами не используете.

Ответ 2

У меня такая же проблема: An -observeValueForKeyPath: ofObject: change: context: сообщение получено, но не обработано. У меня есть googled здесь, тогда я сам это понял, так что, возможно, это помогает кому-то.

Для меня проблема заключалась в том, что объект зарегистрирован как наблюдатель (если у вас есть ... addObserver: self..., то этот объект self) имеет был выпущен в тот момент, когда значение было изменено. Но наблюдатель все еще был зарегистрирован, поэтому сообщение -observeValueForKeyPath:ofObject:change:context: было получено наблюдателем nil.