NSURLConnection完成的三个主要任务:获取数据(通常是JsON、XML等)、文件上传、文件下载。而在NSURLSession时代,他们分别由三个任务来完成:NSURLSessionData、NSURLSessionUploadTask、NSURLSessionDownloadTask,这三个类都是NSURLSessionTask这个抽象类的子类,相比直接使用NSURLConnection,NSURLSessionTask支持任务的暂停、取消和恢复,并且默认任务运行在其他非主线程中
1.定义好变量,并遵循NSURLSessionDownloadDelegate协议
var downloadTask : NSURLSessionDownloadTask? var partialData : NSData? var session : NSURLSession? var request : NSMutableURLRequest?
@H_403_18@
2.为每个按钮增加点击事件 @H_403_18@//开始下载 @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() }@H_403_18@ 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 } } } ) }
@H_403_18@
4.下载
//任务完成,不管是否下载成功 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,dIDWriteData bytesWritten: Int64,totalBytesWritten: Int64,totalBytesExpectedToWrite: Int64) { self.setUIStatus(totalBytesWritten,expectedToWrite: totalBytesExpectedToWrite) }总结
以上是内存溢出为你收集整理的Swift 下载文件 支持断点下载全部内容,希望文章能够帮你解决Swift 下载文件 支持断点下载所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)