КВО наблюдения против NSNotificationCenter наблюдения - PullRequest
10 голосов
/ 20 сентября 2011

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

Ответы [ 2 ]

15 голосов
/ 20 сентября 2011

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

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

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

0 голосов
/ 17 февраля 2015

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

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

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

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

...