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