Swift - RxSwift的使用详解48(结合RxAlamo
2018-04-16 本文已影响465人
八级大狂风AM
七、文件下载
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)