Наблюдение KVO vs наблюдение NSNotificationCenter

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

2 ответов


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

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

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


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

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

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

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