NSURLConnection完成的三个主要任务:获取数据(通常是JSON、XML等)、文件上传、文件下载。而在NSURLSession时代,他们分别由三个任务来完成:NSURLSessionData、NSURLSessionUploadTask、NSURLSessionDownloadTask,这三个类都是NSURLSessionTask这个抽象类的子类,相比直接使用NSURLConnection,NSURLSessionTask支持任务的暂停、取消和恢复,并且默认任务运行在其他非主线程中
1.定义好变量,并遵循NSURLSessionDownloadDelegate协议
var downloadTask : NSURLSessionDownloadTask?
var partialData : NSData?
var session : NSURLSession?
var request : NSMutableURLRequest?
//开始下载
@IBAction func onDownLoad(sender: AnyObject) {
self.downloadFile()
}
//挂起下载
@IBAction func onSuspend(sender: AnyObject) {
if(self.downloadTask != nil)
{
//挂起下载任务,将下载好的数据进行保存
self.downloadTask?.cancelByProducingResumeData({ (resumeData:NSData!) -> Void in
self.partialData = resumeData
self.downloadTask = nil
})
}
// downloadTask!.suspend()
}
//恢复下载
@IBAction func onResume(sender: AnyObject) {
if(self.downloadTask == nil)
{
//判断是否又已下载数据,有的话就断点续传,没有就完全重新下载
if(self.partialData != nil)
{
self.downloadTask = self.session?.downloadTaskWithResumeData(self.partialData!)
}
else{
self.downloadTask = self.session?.downloadTaskWithRequest(self.request!)
}
}
downloadTask!.resume()
}
//开始下载文件
func downloadFile()
{
NSLog("正在下载")
//创建URL
var urlStr:NSString = NSString(string: "http://cdn.wall88.com/51a317b5ef36713194.jpg")
urlStr = urlStr.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!
var url = NSURL(string: urlStr)!
//创建请求
request = NSMutableURLRequest(URL: url)
//创建默认会话
var sessionConfig : NSURLSessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration()
sessionConfig.timeoutIntervalForRequest = 20 //设置请求超时时间
sessionConfig.allowsCellularAccess = true //是否允许蜂窝网络下载
//创建会话
session = NSURLSession(configuration: sessionConfig, delegate: self, delegateQueue: nil)//指定配置和代理
downloadTask = session!.downloadTaskWithRequest(request!)
downloadTask!.resume()
}
3.根据下载内容的大小更新进度条
//设置页面状态
func setUIStatus(totalBytesWritten : Int64,expectedToWrite totalBytesExpectedToWrite:Int64 )
{
//调用主线程刷新UI
dispatch_async(dispatch_get_main_queue(), {
if(Int(totalBytesExpectedToWrite) != 0 && Int(totalBytesWritten) != 0)
{
//更新进度条
self.ps.progress = Float(Float(totalBytesWritten) / Float(totalBytesExpectedToWrite))
if(totalBytesExpectedToWrite == totalBytesWritten)
{
self.lbl_hint.text! = "下载完毕"
UIApplication.sharedApplication().networkActivityIndicatorVisible = false
self.btn_download.enabled = true
}
else{
self.lbl_hint.text = "正在下载"
UIApplication.sharedApplication().networkActivityIndicatorVisible = true
}
}
}
)
}
//任务完成,不管是否下载成功
func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?) {
self.setUIStatus(0, expectedToWrite: 0)
if(error != nil)
{
NSLog("error is:\(error!.localizedDescription)")
}
}
//下载完成
func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL) {
var error:NSError?
var cachePath : NSString = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.CachesDirectory, NSSearchPathDomainMask.UserDomainMask, true).first as NSString
var savePath = cachePath.stringByAppendingPathComponent(lbl_title.text!)
NSLog("\(savePath)")
var saveUrl : NSURL = NSURL(fileURLWithPath: savePath)!
var defalutManager = NSFileManager.defaultManager()
//判断文件是否存在,存在则删除
if(defalutManager.fileExistsAtPath(savePath))
{
defalutManager.removeItemAtPath(savePath, error: &error)
}
//下载成功后,文件是保存在一个临时的目录中的,需要自己拷置到该文件的目录
defalutManager.copyItemAtURL(location, toURL: saveUrl, error: &error)
if(error != nil)
{
NSLog("\(error)")
}
}
//下载中
func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) {
self.setUIStatus(totalBytesWritten, expectedToWrite: totalBytesExpectedToWrite)
}