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



Книга Диспетчер загрузки на 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
}

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


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


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


903   0  

Comments

    Ничего не найдено.