В этой статье будет показано, как легко загрузить аудио- или любой другой медиафайл из 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
}
Вот теперь все. 😎
Спасибо за внимание!
Исходный код здесь.
Читайте также:
- Двоичный поиск в Swift и расширение возможностей коллекций
- Создание кастомного навигационного представления в SwiftUI
- Как работает проверка доступности API в Swift
Читайте нас в Telegram, VK и Яндекс.Дзен
Перевод статьи Hardik Modha: Download Manager in Swift