Найти в Дзене
Nuances of programming

Диспетчер загрузки на Swift

Оглавление

Источник: Nuances of Programming

В этой статье будет показано, как легко загрузить аудио- или любой другой медиафайл из URL-адреса и сохранить его в локальной базе данных.

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

Итак, начнем.

В этой статье будут рассмотрены и проиллюстрированы примерами кода три главных аспекта:

  • загрузка файла;
  • сохранение файла;
  • чтение файла.

URLSession

Первым делом создаем объект URLSession. Основное назначение объекта URLSession  —  предоставление файла для запуска, приостановки и возобновления загрузки.

lazy var downloadsSession: URLSession = {
let configuration = URLSessionConfiguration.background(withIdentifier:
"com.bgSession")
return URLSession(configuration: configuration, delegate: self, delegateQueue: nil)
}()

URLSessionDownloadDelegate

Теперь создаем экземпляр URLSession в файле контроллера и реализуем в этом файле методы делегата URLSession.

Метод делегата didFinish будет вызван после завершения загрузки и укажет местоположение загруженного файла.

Просто копируем этот элемент из местоположения загруженного файла в каталог документов.

Метод делегата didWriteData будет вызван при загрузке и укажет общее количество записанных вами байтов, а также общее количество байтов, которые вы желаете записать.

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

func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {
// Здесь выполняются какие-либо действия после завершения загрузки
}

func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64,
totalBytesExpectedToWrite: Int64) {
// Здесь показывается ход выполнения загрузки файла }

Теперь переходим к загрузке файлов, для чего URLSession предоставляет метод downloadTask. Он начнет загрузку файлов.

Запуск задачи загрузки

Приведенный ниже код запустит загрузку файла:

func start(with track: Track, downloadState: DownloadState) {

sessionTask = urlSession.downloadTask(with: url)
download.sessionTask?.resume()
}

В URLSession предусмотрена также возможность приостанавливать и возобновлять задачи загрузки.

Приостановка задачи

В URLSession имеется легкий способ приостановки выполнения задач  —  метод cancel, предоставляющий данные для возобновления выполнения.

Вот код, в котором показывается функциональность приостановки выполнения задачи:

func pauseTask() {
download.sessionTask?.cancel(byProducingResumeData: { (data) in download.resumeData = data
})
}

Возобновление задачи

Помимо функциональности приостановки выполнения задачи, URLSession также предоставляет простой способ возобновления выполнения задачи с того места, где загрузка была остановлена.

Это делается с помощью метода для возобновления выполнения задач downloadTask:

func resumeTask(resumeData: Data) {
sessionTask = urlSession.downloadTask(withResumeData: resumeData)
}

На этом с запуском, приостановкой и возобновлением загрузки файла мы закончили.

-2

Сохранение загруженного файла в файловой системе

После завершения задачи загрузки сохраним этот файл в файловой системе:

func localFilePath(for url: URL) -> URL? {
guard let documentsPath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return nil }
return documentsPath.appendingPathComponent(url.lastPathComponent)
}

func isFileExist(destinationPath: String) -> Bool {
return FileManager.default.fileExists(atPath: destinationPath)
}

После сохранения файла в файловой системе мы готовы начинать, ставить на паузу и останавливать воспроизведение песни.

AVAudioPlayer

В iOS есть простой в использовании и легкоинтегрируемый встроенный фреймворк AVAudioPlayer. Испытаем его в деле и посмотрим, насколько он хорош.

AVAudioPlayer позволяет с легкостью проигрывать аудио, ставить на паузу и останавливать воспроизведение.

Чтобы проделывать все это с аудиофайлами в AVAudioPlayer, приступим к его интеграции.

-3

Сначала создадим ссылку на аудиоплеер:

private var player: AVAudioPlayer? = nil

Затем создадим AVAudioPlayer и воспроизведем аудио. Делается это с помощью такого кода:

if player == nil {
player = try? AVAudioPlayer(contentsOf: destinationURL)
player?.play()
}

А теперь поставим проигрываемое аудио на паузу. Используем для этого следующий фрагмент кода:

if let player = self.player, player.isPlaying {
player.pause()
}

Наконец, для остановки воспроизведения аудиофайла задействуем такой код:

if let player = self.player, player.isPlaying {
player.stop()
self.player = nil }

Вот теперь все.

Спасибо за внимание!

Исходный код здесь.

Читайте также:

Читайте нас в TelegramVK

Перевод статьи Hardik Modha: Download Manager in Swift