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



Download 3,69 Mb.
Pdf ko'rish
bet220/228
Sana21.07.2022
Hajmi3,69 Mb.
#834838
1   ...   216   217   218   219   220   221   222   223   ...   228
Bog'liq
Нативная разработка мобильных приложений

Библиотека URLSession
Вернемся к нашему методу 
fetchLocations(for:completionHandler:errorHandler:)
и добавим его реализацию. При этом мы используем библиотеку 
URLSession

а конкретнее – класс 
URLSessionDataTask
из нее.
Организовать сетевые взаимодействия можно несколькими способами. Биб-
лиотека 
URLSession
, в частности, разбивает взаимодействия на три типа с тремя 
разными реализациями интерфейса 
URLSessionTask
(фактически представляю
-
щего единичный запрос), которые упрощают работу с ними: 
URLSessionDataTask

URLSessionDownloadTask
и 
URLSessionUploadTask
.
Каждый из этих реализаций обеспечивает уникальную функциональность 
для своей цели. Тип 
URLSessionDataTask
, который мы будем использовать, пред
-
назначен для извлечения данных из URL – это именно то, что нам нужно. Более 
подробно об этих объектах рассказывается в главе 9.
Посмотрим, как можно использовать 
URLSessionDataTask
в нашем коде:
let url = URL(string: "http://localhost:3000/locations?country=\(country)")!
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
}
task.resume()


Вызов службы 

359
Здесь сначала создается URL с адресом нашей службы поиска. В настоящее 
время служба доступна по адресу 
ht
tp://localhost:3000/locatio
n
, если вы следо
-
вали за примером создания службы Node выше в этой главе, в противном случае 
используйте любой другой URL, уместный здесь. Инициализатор 
URL(string:)
генерирует объект 
URL
, поддерживающий пустое значение, то есть экземпляр 
типа 
URL?
. Мы принудительно распаковываем с использованием оператора 
!

потому что точно знаем, что он не будет содержать пустого значения. (Но даже 
если это произойдет, для нас предпочтительнее узнать об этом, получив ава
-
рийное завершение приложения!)
Далее используется свойство 
shared
класса 
URLSession
, чтобы получить доступ 
к разделяемому сеансу и сгенерировать экземпляр 
URLSessionDataTask
вызовом 
метода 
dataTask(with:completionHandler:)
– мы нигде не создаем экземпляры 
URL­
SessionDataTask
непосредственно. Полученный экземпляр сохраняется в пере
-
менной 
task
.
Обработчик завершения имеет три параметра: 
data

response
и 
error
. Пара
-
метр 
data
имеет тип 
Any?
и содержит данные, полученные в ответе. Параметр 
response
содержит экземпляр ответа типа 
URLResponse
, а параметр 
error
, содер
-
жащий экземпляр 
Error?
, используется для проверки успешного выполнения 
запроса.
Прямо сейчас наш метод 
fetchLocations(for:completionHandler:errorHandler)
уже сможет послать запрос службе, но, поскольку замыкание с обработчиком 
завершения имеет пустое тело, ничего не произойдет. Давайте исправим это. 
Вот как должно выглядеть полное тело нашего метода:
func fetchLocations(for country: String, 
completionHandler: @escaping ([Location]) -> (),
errorHandler: @escaping (Error?) ­> ()) {
let url = URL(string: "http://localhost:3000/locations?country=\(country)")!
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
if let error = error {
// Возникла ошибка на стороне сервера
errorHandler(error)
return
}
guard let response = response as? HTTPURLResponse,
response.statusCode < 300 else {
// Возникла ошибка на стороне клиента
errorHandler(nil)
return
}
guard let data = data else {
// Получены недействительные данные
errorHandler(nil)
return
}
// Преобразовать данные в массив [Location] 
}
task.resume()
}


360

Сетевые операции в приложении
В теле 
dataTask(with:completionHandler:)
мы передаем замыкание, которое:
1) проверяет наличие ошибки на стороне сервера, анализируя параметр 
error
. Если произошла ошибка, вызывается замыкание 
errorHandler
, и за
-
тем управление возвращается приложению;
2) если на стороне сервера никаких ошибок не возникло (то есть 
error
со
-
держит значение 
nil
), проверяется код состояния HTTP-ответа – он дол
-
жен быть меньше 
300
. Если это не так, снова вызывается 
errorHandler
, но 
этот раз, так как 
error
содержит значение 
nil
, мы передаем обработчику 
nil
;
3) если сетевая операция завершилась успешно, проверяются полученные 
данные. Объект 
data
должен быть непустым. Если данные отсутствуют, 
снова вызывается 
errorHandler
с параметром 
nil
.
Теперь возьмем этот объект с данными и преобразуем содержащийся в нем 
документ JSON в массив объектов 
Location
. После добавления необходимого 
кода получаем следующий файл 

Download 3,69 Mb.

Do'stlaringiz bilan baham:
1   ...   216   217   218   219   220   221   222   223   ...   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