Наблюдение значения ключа с помощью NSMutableData iOS

В моей модели у меня есть NSMutableData Object с именем data. Я хочу наблюдать это от другого объекта и получать уведомление, когда данные добавляются или удаляются.

Я понимаю, что это отношение ко многим, поэтому я не могу использовать обычный KVO, сначала добавив наблюдателя с этим кодом

[object addObserver:self forKeyPath:@"data" options:NSKeyValueObservingOptionNew context:NULL];

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

Я прочитал документацию по наблюдению значения ключа и нашел другие посты об этом. Наблюдение за изменениями в изменчивом массиве с использованием KVO против NSNotificationCenter и наблюдение за NSMutableArray для вставки / удаления. Все они используют NSMutableArray в качестве примера. Это также возможно для NSMutableData? Я не понимаю, что я должен реализовать тогда.

Может кто-нибудь сказать мне, что именно я должен реализовать, в каком классе, чтобы получить KVO для объекта NSMutableData работает? Или, если это невозможно, другое решение?

Большое спасибо!

2 ответа

Решение

Существует общее недоразумение с KVO: невозможно наблюдать внутреннее состояние свойства, совместимого с KVO.

Так обстоит дело с NSData: с точки зрения KVO свойство данных вашего объекта не меняется, меняется его состояние NSData. Если NSMutableData предоставит KVO-совместимые свойства для своего содержимого, вы можете наблюдать изменения, наблюдая путь ключа (например, @"data.contents"), но это не так.

KVO работает только для свойств, совместимых с KVC, которые также задокументированы как совместимые с KVO. Большинство каркасных классов Cocoa не дают такой гарантии, и это ошибка для наблюдения за объектами и их ключевыми путями.

Решением для вашего случая было бы не подвергать NSMutableData как публичное свойство, но вместо этого используйте неизменные данные и добавьте такие методы, как appendData: в ваш пользовательский класс. Это дало бы вам возможность вносить изменения в объект данных в этих методах и отправлять уведомления KVO вручную (используя willChangeValueForKey:@"data"... сделать изменения... didChangeValueForKey:@"data").

КВО не поможет вам наблюдать за внутренними изменениями NSMutableData. В вашем примере вы наблюдаете только свойство "data", и вы будете получать уведомления об изменениях только в том случае, если свойство data вашей модели будет изменено (например, вы назначите другой экземпляр NSData).

В вашем случае я хотел бы предложить вам использовать уведомления: объект, который интересуется мутациями данных, подписывается на уведомление о заданном имени, и модель публикует это уведомление каждый раз, когда новые данные добавляются к данным модели.

Другие вопросы по тегам