4

Недавно я нашел преимущество использования NSNotifications при создании очень индивидуальных макетов в моем приложении iOS. Теперь я использую их для отправки данных round вместо использования делегатов. Например, у меня есть UIScrollView в одном контроллере, который изменяет альфу изображения в другом view controller, поэтому я просто отправляю уведомления в виде свитков прокрутки, например.Я слишком много использую NSNotifications

func scrollViewDidScroll(scrollView: UIScrollView) { 

     let userInfo = ["ScrollView":scrollView] 
     NSNotificationCenter.defaultCenter().postNotificationName("scrollViewScrolled", object: self, userInfo: userInfo) 
} 

И обратите внимание на это в другом контроллере. Я знаю, что NSNotifications не дорогие по производительности, но в той степени, в которой я их использую, и данных, которые я отправляю с ними, я задавался вопросом, будет ли это считаться плохой практикой.

ответ

2

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

По-моему, в большинстве случаев использование уведомлений - это плохой выбор, основанный либо на плохом дизайне, либо на лени. Если вы посмотрите на свой код, трудно сказать, как все это соединяется, кто отвечает за что и т. Д. Кроме того, он довольно негибкий в том, кто делает то, что с помощью уведомлений. Например, подумайте о том, что вы хотите повторно использовать один из контроллеров своего вида в другом месте, что, вероятно, не захочет запускать эти уведомления. Теперь следующий запах кода не за горами. Вы начинаете исправлять обработку уведомлений или данные только для того, чтобы добиться этого и бороться с побочными эффектами.

Это не значит, что уведомления плохие. Они используют их, и это может быть уместно здесь и там. Просто большую часть времени это уродливый быстрый хак, который заставляет вещи пахнуть в долгосрочной перспективе (и очень трудно отлаживать).

2

IMO они должны использоваться для скрытых событий, то есть указывать, что что-то закончилось, например. Чтобы использовать их для отправки непрерывного потока данных, поскольку что-то меняется, не рекомендуется, даже если нет удара производительности.

Они обеспечивают очень свободную муфту, но использовать их для их использования, чтобы обеспечить очень свободную муфту только для того, чтобы обеспечить свободную муфту, не является хорошим дизайном в моем скромном мнении, его зашел слишком далеко и превратился из шаблона дизайна в дизайн анти-шаблон. Нет смысла делать разные части вашего кода слабо связанными, если нет необходимости и не приносит никакой пользы.

0

NSNotification следует использовать, чтобы уведомить другую организацию об изменении, а не передавать данные. Вы можете передать объект NSNotification, чтобы сообщить получателю о том, что такое уведомление.

Если получатель получает уведомление о, скажем, изменении настройки. Приемник может проверить, что именно изменилось, на основе переданного параметра и действовать соответствующим образом.

Если, например, данные прибыли, вы просто уведомляете о том, что данные прибыли, а затем используют общий ресурс для получения реальных данных. Общим ресурсом может быть одноэлемент, база данных или что-то еще. Надеюсь, это вам станет ясно.