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