2017-01-30 3 views
0

Для супервайзеров: Я много искал, прежде чем решил задать вопрос , но я не нашел именно то, что хочу.NotificationCenter или закрытие?

Мой вопрос: Что лучше между использованием NotificationCenter и используя Closures для обмена данными между двумя экземплярами? Если они похожи, что я должен использовать?

Будет надеяться, что этот пример поможет вам лучше понять: -

Если мы возьмем URLSession класса в качестве примера. Почему большинство его методов имеют закрытие? Почему они не отправляют уведомление с Data, Response, and Error внутри него?

Я знаю разницу между ними, Я просто не знаю, в каких ситуациях я должен использовать каждый.

+0

Вы имеете в виду обратный вызов в качестве противодействия закрытию? –

+0

@ RyanH. Я имею в виду: когда или в каких ситуациях я должен использовать центр уведомлений (проводка и наблюдение за уведомлениями), если я всегда могу добиться того же результата, используя закрытие. – 3li

ответ

2

В некоторых случаях образцы являются взаимозаменяемыми, однако:

  1. Использование закрытия является самым простым решением для простых случаев
  2. Использование делегата является общим, когда существует сложная связь между двумя объектами. Один делегат может быть лучше многих закрытий.
  3. Вы должны использовать оповещения, когда у вас есть несколько наблюдателей или когда вы не уверены, какие объекты будут наблюдаться.

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

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

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

+0

Благодарим вас за полезный ответ. Не могли бы вы объяснить больше о том, что вы подразумеваете под «простыми случаями» и «сложной связью»? – 3li

+1

@ 3li Простым случаем является обратный вызов завершения (то есть информация, отправленная наблюдателю, проста - например, объект результата, и он вызывается только один раз). Если вы посмотрите на делегаты 'UITableView', вы увидите пример сложной связи. У вас есть 20 обратных вызовов, которые можно вызвать несколько раз (например, 'didSelect'). Выполнение этого с использованием нескольких замыканий было бы очень сложным. Не невозможно, просто сложно. Закрытия легкие, самые простые в использовании, но как только взаимодействие между объектами становится слишком сложным, то делегирование является ответом. – Sulthan

+0

Ага, я понял. Спасибо огромное! ❤️ – 3li

Смежные вопросы