Swift - RxSwift的使用详解48(结合RxAlamofire使用4:文件下载)

七、文件下载

1,自定义下载文件的保存目录

(1)下面代码将 logo 图片下载下来,并保存到用户文档目录下(Documnets 目录),文件名不变。

//指定下载路径(文件名不变)
let destination: DownloadRequest.DownloadFileDestination = { _, response in
    let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
    let fileURL = documentsURL.appendingPathComponent(response.suggestedFilename!)
    //两个参数表示如果有同名文件则会覆盖,如果路径中文件夹不存在则会自动创建
    return (fileURL, [.removePreviousFile, .createIntermediateDirectories])
}
 
//需要下载的文件
let fileURL = URL(string: "http://www.hangge.com/blog/images/logo.png")!
 
//开始下载
download(URLRequest(url: fileURL), to: destination)
    .subscribe(onNext: { element in
        print("开始下载。")
    }, onError: { error in
        print("下载失败! 失败原因:\(error)")
    }, onCompleted: {
        print("下载完毕!")
    })
    .disposed(by: disposeBag)

(2)将 logo 图片下载下来,并保存到用户文档目录下的 file1 子目录( Documnets/file1 目录),文件名改成 myLogo.png

//指定下载路径和保存文件名
let destination: DownloadRequest.DownloadFileDestination = { _, _ in
    let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
    let fileURL = documentsURL.appendingPathComponent("file1/myLogo.png")
    //两个参数表示如果有同名文件则会覆盖,如果路径中文件夹不存在则会自动创建
    return (fileURL, [.removePreviousFile, .createIntermediateDirectories])
}
 
//需要下载的文件
let fileURL = URL(string: "http://www.hangge.com/blog/images/logo.png")!
 
//开始下载
download(URLRequest(url: fileURL), to: destination)
    .subscribe(onNext: { element in
        print("开始下载。")
    }, onError: { error in
        print("下载失败! 失败原因:\(error)")
    }, onCompleted: {
        print("下载完毕!")
    })
    .disposed(by: disposeBag)

2,使用默认提供的下载路径

Alamofire 内置的许多常用的下载路径方便我们使用,简化代码。注意的是,使用这种方式如果下载路径下有同名文件,不会覆盖原来的文件。

比如,下载到用户文档目录下可以改成:

let destination = DownloadRequest.suggestedDownloadDestination(for: .documentDirectory)

3,下载进度

(1)下面代码在文件下载过程中会不断地打印出当前下载进度、已下载部分的大小、以及文件总大小(单位都是字节)。

//开始下载
download(URLRequest(url: fileURL), to: destination)
    .subscribe(onNext: { element in
        print("开始下载。")
        element.downloadProgress(closure: { progress in
            print("当前进度: \(progress.fractionCompleted)")
            print("  已下载:\(progress.completedUnitCount/1024)KB")
            print("  总大小:\(progress.totalUnitCount/1024)KB")
        })
    }, onError: { error in
        print("下载失败! 失败原因:\(error)")
    }, onCompleted: {
        print("下载完毕!")
    }).disposed(by: disposeBag)

(2)下面我换种写法,将进度转成可观察序列,并绑定到进度条上显示。

//开始下载
download(URLRequest(url: fileURL), to: destination)
    .map{request in
        //返回一个关于进度的可观察序列
        Observable<Float>.create{observer in
            request.downloadProgress(closure: { (progress) in
                observer.onNext(Float(progress.fractionCompleted))
                if progress.isFinished{
                    observer.onCompleted()
                }
            })
            return Disposables.create()
        }
    }
    .flatMap{$0}
    .bind(to: progressView.rx.progress) //将进度绑定UIProgressView上
    .disposed(by: disposeBag)

RxSwift使用详解系列
原文出自:www.hangge.com转载请保留原文链接

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 179,156评论 25 708
  • .bat脚本基本命令语法 目录 批处理的常见命令(未列举的命令还比较多,请查阅帮助信息) 1、REM 和 :: 2...
    庆庆庆庆庆阅读 8,537评论 1 19
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,628评论 19 139
  • 江畔红 江水悠悠思绪流, 滚滚情长舟满畴。 莫道桃花江畔芜, 三石伊始盈君开。
    心放飞阅读 163评论 0 0
  • 我想告诉你尘封多年的旧事 雨水打湿了泛黄的信笺 好似老妇人思念故人的泪 精心叠制的紫色千纸鹤 裹着回忆的酸 沾着往...
    陆心远阅读 350评论 5 24

友情链接更多精彩内容