// MARK: 下载文件
/**
下载文件
- parameter urlStr: 文件的网络地址
- parameter savePath: 保存路径(包含文件名)
- parameter progress: 进度
- parameter resultBlock: 结果回调
*/
func download(urlStr: String, savePath: String, progress: ((_ progress: Double) -> ())?, resultBlock: ((URL?, Error?)->())?) {
let urlRequest = URLRequest(url: URL(string: urlStr)!)
let task = self.downloadTask(with: urlRequest, progress: {
if progress != nil {
progress!(($0.fractionCompleted))
}
}, destination: { (url, response) -> URL in
return URL(fileURLWithPath: savePath)
}, completionHandler: { (response, url, error) in
if resultBlock != nil {
resultBlock!(url, error)
}
})
task.resume()
}
////////////////////////////////////////////////////////////////
追踪下载进度
在下载开始之后,请求会开始更新progress,这是一个NSProgress类型的属性。app通过对progress.fractionCompleted进行KVO来追踪下载进度。这需要开始和结束观察,以及添加当值改变时执行的代码。列表4-6展示了如何开始和结束观察进度。列表4-7展示了当值改变时执行的代码。
列表4-6 开始和结束追踪下载进度
|
1
2
3
4
5
|
// Start observing fractionCompleted for the progress[self.resourceRequest.progress addObserver:self forKeyPath:@"fractionCompleted" options:NSKeyValueObservingOptionNew context:NULL]; // Stop observing fractionCompleted for the progress[self.resourceRequest.progress removeObserver:self forKeyPath:@"fractionCompleted"]; |
列表4-7 当fractionCompleted的值改变时执行的代码
|
1
2
3
4
5
6
7
8
9
|
//-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ // Check for the progress object and key if ((object == self.resourceRequest.progress) && ([keyPath isEqualToString:@"fractionCompleted])) { double progressSoFar = self.resourceRequest.progress.fractionCompleted; // do something with the value }} |
追踪下载的两个重要用途是:
-
调整下载优先级。如果下载时间过长可以提高优先级,如果时间充裕可以降低优先级。
-
为用户提供下载进度反馈。可以使用一个简单的进度条来反馈fractionCompleted的值。
本文介绍了一种使用Swift语言实现文件下载的方法,并通过回调函数实时更新下载进度。此外,还详细介绍了如何利用KVO机制追踪下载任务的进度。

467

被折叠的 条评论
为什么被折叠?



