Разница между NSNotifications и наблюдением значения ключа в значительной степени связана с сопряжением, но есть и последствия для производительности.
Каждый может подписаться на ваши NSNotifications. Все, что им нужно знать, это строка / ключ, под которым вы уведомляете. Им не нужно ничего знать о ваших классах / объектном графе и т. Д. Поэтому, когда вы хотите уведомить мир, который не знает о деталях вашего класса, NSNotification - это путь. Например, если вы отправляете фреймворк другим разработчикам, вероятно, лучше уведомить об этом с помощью NSNotification, чем раскрывать внутреннюю часть вашей фреймворка в той степени, которая может потребоваться для того, чтобы потребители могли получить ключ-значение. Наблюдайте за вашими объектами.
Чтобы KVO наблюдал за объектом, вы сначала должны иметь возможность получить ссылку на него, что не совсем верно для NSNotifications (но, как правило, бывает так, по моему опыту.) Во-вторых, вам нужно знать достаточно о реализация, чтобы знать, что наблюдать. С NSNotification уведомителю нужно только опубликовать строку / ключ уведомления. С KVO вам нужно знать имя свойства объекта. Конечно, кто-то может опубликовать статические строки и сказать вам «вы можете KVO me для этих свойств», но это фактически становится контрактом API, который может быть сложнее поддерживать в будущем. (Скажем, например, что вы хотите удалить это свойство в будущей версии - тогда вам нужно настроить другие вещи, чтобы продолжать отправлять эти уведомления и предоставлять значения, когда люди вызывают valueForKey: - короче, как только вы это сделаете, Вы никогда не сможете изменить это свойство.)
Другая вещь, которую следует помнить с этими различными степенями связи, заключается в том, что с KVO может ожидаться, что наблюдатель знает о деталях ваших классов / объектов. В конце концов, они регистрируют очень специфический интерес к вашему объекту; они утверждают, что знают, что это значит - как это работает. Поэтому вы можете ожидать, что они будут чувствительны к последствиям производительности. С помощью NSNotifications потребитель может наблюдать за вашим уведомлением, практически ничего не зная о вас, и может не знать о влиянии на производительность своих действий в ответ на уведомление.
Недостаток, разделяемый двумя подходами, заключается в том, что при отсутствии дополнительной работы они выполняются синхронно. Уведомляющий объект зависит от того, что наблюдатель решает сделать (синхронно), когда он получает уведомление. Эти два механизма отличаются тем, что для NSNotification довольно легко для уведомляющего объекта использовать executeSelector: afterDelay: заставить отправлять уведомление «асинхронно» (относительно вызова, который порождает уведомление) на следующем проходе запуска цикл (см. также NSNotificationQueue). Это не так легко возможно с КВО. Это различие само по себе может иметь решающее значение в определенной ситуации.
Как правило, я нахожу, что слабая связь NSNotification поддается событиям, которые являются либо крупнозернистыми (то есть потенциально представляют большую группу изменений), либо относительно редкими. Уведомления KVO по своей природе являются мелкозернистыми. Вы явно наблюдаете изменение одного свойства (на каждую регистрацию) для одного объекта. Это может взорвать количество регистраций и количество уведомлений. Каждое наблюдение имеет стоимость исполнения.
Другим общим недостатком обоих является отладка. Я упомянул в комментарии выше, что KVO может быть проблемой для отладки, и он разделяет эту проблему с NSNotificationCenter.
Основное различие между этими двумя и шаблоном делегата является то, что делегат отношение, как правило, 1: (. Один делегатом) 1 (Конечно, вы могли бы иметь массив делегатов, но это довольно редко, и спорный анти-паттерн. ) NSNotification и KVO оба по своей сути 1: N (много наблюдателей.)
В заключение я всегда хотел сказать: «Используйте самый высокий уровень абстракции, который сделает работу».Если вам нужны только отношения 1: 1, используйте делегата.Для уведомлений 1: N, если NSNotification будет работать - другими словами, если желаемое связывание низкое и / или уведомления являются крупнозернистыми или нечастыми, используйте NSNotifications.Если муфта затянута или необходимость мелкозернистая, используйте КВО.Также помните, что вы можете адаптировать шаблон делегата от 1: 1 до 1: N, отправив делегату NSNotifiations.С NSNotifications и KVO вы не можете реально контролировать, кто наблюдает за вами или сколько у вас наблюдателей.