Нативная разработка мобильных приложений


внимание на делегатов и посмотрим, чем они отличаются от обратных вызо - вов на основе замыканий. Делегаты



Download 3,69 Mb.
Pdf ko'rish
bet69/228
Sana21.07.2022
Hajmi3,69 Mb.
#834838
1   ...   65   66   67   68   69   70   71   72   ...   228
Bog'liq
Нативная разработка мобильных приложений

103
внимание на делегатов и посмотрим, чем они отличаются от обратных вызо
-
вов на основе замыканий.
Делегаты
Делегаты поддерживались в Cocoa Touch с самого начала создания этой биб-
лиотеки. Они обеспечивают логическую простоту, но, как правило, для их ис
-
пользования требуется написать больше кода, чем в случае с замыканиями. Вот 
тот же самый класс 
NetworkService
, но теперь вместо замыкания он использует 
делегата:
protocol NetworkServiceDelegate: class {
func fetchDidComplete(success: Bool, with error: Error?)
}
class NetworkService {
weak var delegate: NetworkServiceDelegate?
func fetchData(for url: URL) {
...
}
func onSuccess() {
delegate?.fetchDidComplete(success: true, with: nil)
}
func onError(error: Error) {
delegate?.fetchDidComplete(success: false, with: error)
}
}
class APIClient {
init() {
let api = NetworkService()
api.delegate = self
api.fetchData()
}
}
extension APIClient: NetworkServiceDelegate {
func fetchDidComplete(success: Bool, with error: Error?) {
if success {
print("Success!")
} else {
print("Uh-oh!")
}
}
}
Как видите, здесь мы определили протокол с именем 
NetworkServiceDelegate

Сигнатура метода обратного вызова в этом примере аналогична сигнатуре за
-
мыкания 
completion
– она включает параметры 
Bool
и 
Error
, но теперь имеет имя.
В 
NetworkService
мы добавили свойство 
delegate
для хранения нашего делега
-
та. Это свойство снабжено спецификатором 
weak
, чтобы предотвратить образо
-
вание сильной циклической ссылки. В нем делегат хранит ссылку на родитель
-


104

Передача сообщений
ский объект; если ссылка будет объявлена сильной, это помешает удалению 
любого объекта из памяти, и эта ошибка легко может остаться незамеченной.
Обратите внимание, что большая часть кода осталась неизменной, только 
вместо вызова замыкания в 
NetworkService
мы не вызываем делегата напрямую 
через 
delegate?.fetchDidComplete(success:with:)
.
Чтобы фактически вызвать наш API, нужно создать объект, который создаст 
экземпляр 
NetworkService
, установит себя в качестве делегата и вызовет 
fetch­
Data()
, чтобы получить данные из сети. В нашем примере эту задачу решает 
класс 
APIClient
.
Наконец, фактическая реализация метода делегата, требуемая протоколом 
NetworkServiceDelegate
, реализована как расширение класса 
APIClient
. Каждый 
раз, когда вызывается метод 
fetchData
, вызывается метод 
fetchDidComplete(succe
ss:with:)
, и наше сообщение об успехе или неудаче выводится в консоль.
Как вы наверняка заметили, этот подход требует больше кода, чем подход на 
основе замыканий, но сами вызовы выглядят довольно просто. Однако этот код 
быстро может стать слишком громоздким, тем не менее, учитывая, насколько 
глубоко укоренился этот шаблон в Cocoa Touch, рано или поздно вы неизбежно 
столкнетесь с ним. От себя мы можем посоветовать всегда использовать замы
-
кания, когда важна асинхронность или есть только одна ветвь в коде, где можно 
вызывать замыкание, а делегатов использовать, только когда нужно обеспе
-
чить синхронную передачу сообщений.
В некоторых ситуациях использование замыканий и делегатов сопряжено 
с дополнительными и ненужными сложностями. Когда возникнет необходи
-
мость в нескольких замыканиях, выполняемых в тандеме, или в нескольких 
делегатах, получающих одно и то же сообщение, задумайтесь о возможности 
использовать 
NotificationCenter
и родственные ему механизмы.

Download 3,69 Mb.

Do'stlaringiz bilan baham:
1   ...   65   66   67   68   69   70   71   72   ...   228




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish