Подтвердить что ты не робот

Наблюдение KVO против наблюдения NSNotificationCenter

Мне интересно, есть ли причина использовать один над другим в наблюдениях KVO и NSNotificationCenter. Производительность, использование памяти, скорость и т.д.

4b9b3361

Ответ 1

Оба не всегда взаимозаменяемы. Концептуально KVO предназначен только для наблюдения свойства объекта. Например, вы не можете использовать KVO для замены NSApplicationWillTerminateNotification, потому что он уведомляет наблюдателей о событии, а не об изменении свойства объекта.

Что касается производительности и использования памяти, они быстро работают и используют незначительную память. NSNotificationQueue объединяется, чтобы остановить наводнения уведомлений. Насколько мне известно, KVO не имеет коалесценции, что в какой-то момент вызывало проблемы с производительностью. Я наблюдал сотни объектов, и когда с этими объектами произошло пакетное обновление, я получал сотни обратных вызовов KVO. Это была не проблема производительности с самим KVO, но с моим собственным кодом, запущенным в результате пакетного обновления.

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

Ответ 2

Очень старый вопрос, но подумал о добавлении некоторых пунктов. Я согласен с ответом Тома Даллинга, однако в больших приложениях существует много сценариев, в которых мы склонны добавлять наблюдателя к свойству объекта, и мы не можем, или мы не можем исключая их из списка наблюдателей.

Давайте рассмотрим следующий сценарий из моего приложения: A ViewController отображает объект змеи, я наблюдаю за изменением свойства на этом объекте - "яд". Поэтому всякий раз, когда viewController должен был показать другую змею, я просто удалял контроллер вида из наблюдателя этого объекта змеи.

Приложение разработало, чтобы показать список змей вместо одной змеи, это означает, что я должен был наблюдать за свойством всех змей в этом объекте. Теперь, когда старая змея удаляется из массива, я должен узнать об этом событии, чтобы я мог удалить контроллер представления в качестве наблюдателя из этого объекта змеи. Для этого я должен сначала наблюдать за изменениями в самом массиве. Для этого я должен следовать конкретному протоколу, чтобы вставлять объекты в массив и удалять их из массива. Таким образом, сложность строится. Мы все знаем последствия отказа от удаления наблюдателя от объекта и если этот объект выпущен ОС!

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