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

В этой статье будет показано, как легко загрузить аудио- или любой другой медиафайл из 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)
}

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

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

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

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, приступим к его интеграции.

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

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

Предыдущая статья7 визуальных элементов в дизайне
Следующая статьяРуководство для начинающих по созданию с нуля сайта онлайн-курсов или e-коммерции