URL Session(NSURLSessionDownloadTask)
来源:互联网 发布:githubpages运行js 编辑:程序博客网 时间:2024/06/05 12:40
URL Session(NSURLSession)
URL Session(NSURLSessionDataTask))
URL Session(NSURLSessionUploadTask)
URL Session(NSURLSessionDownloadTask)
URL Session(Cache).md
URL Session(Cookie)
在上一篇博文《URL Session(NSURLSessionUploadTask)》为大家讲解了上传文件,在这篇博文为大家带来下载功能,并且支持并发下载。
下载文件使用的类是NSURLSessionDownloadTask。
1 NSURLSessionDownloadTask
NSURLSessionDownloadTask是NSURLSessionTask的子类,主要处理网络中的下载业务。
下载下来的文件会存储到一个临时文件中,当应用退出后会被销毁。如果你想保存这些数据,需要你将这些数据移动到持久化目录,如document。
在NSURLSessionTask中有以下三个方法。
// 开始任务public func resume()// 挂起任务public func suspend()// 取消任务public func cancel()
前面使用了resume()方法,今天会使用suspend()和cancel()为大家带来暂停下载和取消下载的功能。
2 NSURLSessionDownloadDelegate
在下载的时候,绝大多数的情况都是使用后台下载的。因为用户不可能长时间在一个页面等待下载。后台下载的监听就需要NSURLSessionDownloadDelegate实现了。在NSURLSessionDownloadDelegate中有如下几个方法。
// MARK: 下载完成public func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL)// MARK: 下载中(会多次调用,可以记录下载进度) optional public func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64)// MARK: 重新开始下载optional public func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didResumeAtOffset fileOffset: Int64, expectedTotalBytes: Int64)
3 后台下载
3.1 YJDownloadTaskVC类
下载测试我们使用YJDownloadTaskVC类。
//// YJDownloadTaskVC.swift// NSURLSession//// CSDN:http://blog.csdn.net/y550918116j// GitHub:https://github.com/937447974/Blog//// Created by yangjun on 15/12/3.// Copyright © 2015年 阳君. All rights reserved.//import UIKit// NSURLSessionDownloadTask 下载class YJDownloadTaskVC: UIViewController, NSURLSessionDownloadDelegate { /// 下载器 private var downloadTask: NSURLSessionDownloadTask? override func viewDidLoad() { super.viewDidLoad() // 相关按钮 // 刷新 let refreshItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Refresh, target: self, action: "downloadTaskRefresh") // 开始 let resumeItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Play, target: self, action: "downloadTaskResume") self.navigationItem.leftBarButtonItems = [refreshItem, resumeItem] // 暂停 let suspendItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Pause, target: self, action: "downloadTaskSuspend") // 取消 let cancelItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Cancel, target: self, action: "downloadTaskCancel") self.navigationItem.rightBarButtonItems = [cancelItem, suspendItem] } // MARK: - action // MARK: 刷新 func downloadTaskRefresh() { } // MARK: 开始下载 func downloadTaskResume() { } // MARK: 暂停下载 func downloadTaskSuspend() { } // MARK: 取消下载 func downloadTaskCancel() { }}
这里已经创建了4个按钮。刷新、开始下载、暂停下载和取消下载,并且创建了一个全局属性downloadTask指向一个NSURLSessionDownloadTask。
3.2 创建NSURLSession
在这里我们会以单例的模式创建NSURLSession,这样可以在调度器里面并发请求服务器。
// MARK: - 后台下载// MARK: 获取后台下载的sessionprivate func backgroundSession() -> NSURLSession{ struct Static { static var onceToken: dispatch_once_t = 0 static var session: NSURLSession! } //var static session: NSURLSession! dispatch_once(&Static.onceToken, { () -> Void in let sessionConfiguration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier("com.downloadTask.URLSession") sessionConfiguration.timeoutIntervalForRequest = 20// 请求超时时间 sessionConfiguration.discretionary = true // 系统自动选择最佳网络下载 sessionConfiguration.HTTPMaximumConnectionsPerHost = 5// 限制每次最多5个连接 Static.session = NSURLSession(configuration: sessionConfiguration, delegate: self, delegateQueue: nil)//指定配置和代理 }) return Static.session}
3.3 NSURLSessionDelegate代理实现
通过NSURLSessionDelegate代理,我们能监听下载的进度,以及下载后的链接和下载中的错误。
// MARK: - NSURLSessionDelegate// MARK: 下载完成func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL) { // 下载完成的地址 print(location)}// MARK: 下载中(会多次调用,可以记录下载进度)func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) { let progress: Float = Float(totalBytesWritten) / Float(totalBytesExpectedToWrite) print("\(totalBytesExpectedToWrite)--\(totalBytesWritten)--\(progress)")}// MARK: 重新开始下载func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didResumeAtOffset fileOffset: Int64, expectedTotalBytes: Int64) { let progress: Float = Float(fileOffset) / Float(expectedTotalBytes) print("已下载\(progress)")}// MARK: - NSURLSessionTaskDelegate// MARK: 任务完成,不管是否下载成功func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?) { print("错误: \(error)")}
为了监听下载中的错误,我们实现了NSURLSessionTaskDelegate的func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?)
方法。不管成功还是失败,任务结束后都会调用它。
3.4 业务实现
3.4.1 并发测试
这里是从网上下载一个高清图片,并在队列中连续下载10张照片,由于我们session中设置了并发数为5个,你会发现控制台输出只会同时下载5张照片。
// MARK: - 队列测试func testQueue() { let usrString = "http://g.hiphotos.baidu.com/image/pic/item/472309f790529822c4ac8ad0d5ca7bcb0a46d402.jpg" let url = NSURL(string: usrString) let request = NSMutableURLRequest(URL: url!) let session = self.backgroundSession() // 并发下载10个文件 for _ in 0..<10 { session.downloadTaskWithRequest(request).resume() }}
3.4.2 刷新
刷新的实质是设置downloadTask。
// MARK: - action// MARK: 刷新func downloadTaskRefresh() { // 这是一张高清图片 let usrString = "http://g.hiphotos.baidu.com/image/pic/item/472309f790529822c4ac8ad0d5ca7bcb0a46d402.jpg" let url = NSURL(string: usrString) let request = NSMutableURLRequest(URL: url!) let session = self.backgroundSession() self.downloadTask = session.downloadTaskWithRequest(request)}
3.4.3 开始下载
// MARK: 开始下载func downloadTaskResume() { self.downloadTask?.resume()}
3.4.4 暂停下载
// MARK: 暂停下载func downloadTaskSuspend() { self.downloadTask?.suspend()}
3.4.5 取消下载
// MARK: 取消下载func downloadTaskCancel() { self.downloadTask?.cancel()}
到这里整个项目就结束了,你可以运行项目,点击相关按钮查看下载的效果。
其他
参考资料
URL Session Programming Guide
NSURLSessionDownloadTask Class Reference
文档修改记录
版权所有
CSDN:http://blog.csdn.net/y550918116j
GitHub:https://github.com/937447974/Blog
- URL Session(NSURLSessionDownloadTask)
- URL Session
- session用url传session
- Session通过URL重写
- URL Session(NSURLSession)
- URL Session(NSURLSessionDataTask)
- URL Session(NSURLSessionUploadTask)
- URL Session(Cache)
- URL Session(Cookie)
- URL Session(一)
- session URL重写
- url重写session
- URL重写及Session
- NSURLSessionDownloadTask下载文件
- NSURLSessionDownloadTask 断点下载
- NSURLSessionDownloadTask 下载/断点下载
- NSURLSessionDownloadTask下载内容
- NSURLSessionDownloadTask(下载任务)
- groovy servlet java.lang.NoSuchMethodError: javax.servlet.http.HttpServletResponse.getStatus()I
- ListView异步加载图片,完美实现图文混排
- 数据结构(实验一)第2题
- hpu(acm)大赛第六题
- 健康
- URL Session(NSURLSessionDownloadTask)
- HTML5你不知道的那些功能
- ROS Tutorials to Start Working with Arduino and Raspberry Pi
- Hadoop修改SSH端口号
- 设计模式系列(七)简单工厂模式、工厂方法模式和抽象工厂模式对比
- Curl 工具的妙用:shell中用curl实现业务监控和故障自动处理
- 使用UI Automation实现自动化测试 (InvokePattern)
- 微信支付签名错误-windows
- epoch和iteration的区别