168
Сетевые взаимодействия
}
let url = URL(string: "https://www.example.com/file.zip")!
let client = NetworkClient()
let urlSession = URLSession(configuration: .default, delegate: client, delegateQueue: nil)
let task = urlSession.downloadTask(with: url)
task.resume()
Рассмотрим этот пример подробнее.
Сначала определяется новый класс
NetworkClient
, наследующий
NSObject
– ба
-
зовый класс для всех объектов в языке Objective-C. Для этого класса опреде
-
ляется расширение, в котором реализуется протокол
URLSessionDownloadDelegate
.
Первый метод,
urlSession(_:downloadTask:didFinishDownloadingTo:)
, является обя
-
зательным: когда задание загрузки завершится, оно вызовет этот метод, чтобы
сообщить, где находится временный загруженный файл. Также в теле этого ме
-
тода можно обработать ошибки, возникшие на стороне сервера, проверив код
состояния в свойстве
response
объекта
downloadTask
.
Следующий метод,
urlSession(_:task:didCompleteWithError:)
, является не
-
обязательным, но в промышленных приложениях лучше не пренебрегать им.
Здесь можно обработать ошибки, возникшие на стороне клиента, и проверить,
не возникли ли проблемы, препятствующие успешной загрузке файла. В этом
примере мы просто выводим описание ошибки в консоль.
Наконец то, ради чего мы написали этот пример, – передача прогресса за
-
грузки в приложение. Последний метод в расширении,
urlSession(_:downloadTa
sk:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:)
, вызывается перио
-
дически с интервалом, определяемым сетевыми подсистемами в iOS, и полу
-
чает значения
totalBytesWritten
и
totalBytesExpectedToWrite
. Эти значения можно
использовать для отображения на экране чего угодно, от текстовых меток до
компонентов
UIProgressView
с полосой прогресса. В нашем примере мы выво
-
дим значение в консоль, но вы можете воспользоваться своим воображением,
чтобы представить, что вообще возможно!
В конце примера создается экземпляр нашего класса, который затем пере
-
дается в инициализатор
URLSession
в параметре
delegate
. Обратите особое вни
-
мание на две строки, где это происходит:
...
let urlSession =
URLSession(configuration: .default, delegate: client, delegateQueue: nil)
let task = urlSession.downloadTask(with: url)
task.resume()
Сначала создается экземпляр
URLSession
, а затем, в следующей строке, он ис
-
пользуется для создания экземпляра
downloadTask
. Мы не использовали экземп-
ляр
URLSession.shared
, как в предыдущих примерах, потому что нам понадоби
-
лось определить делегата, а в
URLSession
это можно сделать только с помощью
инициализатора.
Do'stlaringiz bilan baham: