Swift 下载文件 支持断点下载

Swift 下载文件 支持断点下载,第1张

概述NSURLConnection完成的三个主要任务:获取数据(通常是JSON、XML等)、文件上传、文件下载。而在NSURLSession时代,他们分别由三个任务来完成:NSURLSessionData、NSURLSessionUploadTask、NSURLSessionDownloadTask,这三个类都是NSURLSessionTask这个抽象类的子类,相比直接使用NSURLConnectio

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 下载文件 支持断点下载所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1087095.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存