swift URLSession 断点续传

废话不多说直接上代码
//下载进度
@IBOutlet weak var progressVeiw: UIProgressView!
// 全局网络会话 - 管理所有的网络请求
lazy var Session :NSURLSession = {

    let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
    let sessiontem = NSURLSession(configuration: configuration, delegate: self, delegateQueue: nil)
    
    return sessiontem
}()
// 下载任务
var downloadTask  : NSURLSessionDownloadTask!
//续传数据就
var reusmeData:NSData!

override func viewDidLoad() {
    super.viewDidLoad()
  }

//具体操作

 //开始下载
@IBAction func startClick(sender: AnyObject) {
    
    let url = NSURL(string: "http://localhost:8080/123.mp4")
      downloadTask = Session.downloadTaskWithURL(url!)
      downloadTask.resume()
}
//暂停
@IBAction func pasueClick(sender: AnyObject) {
    
    //防止在此被暂停
    if downloadTask == nil {
        print("不需要暂停下载任务")
        return
   }
    downloadTask.cancelByProducingResumeData { (data:NSData?) in
        
        // 保存续传数据
        self.reusmeData = data!
        
        //释放下载任务 防止在次暂停
        self.downloadTask = nil
        
    }
}

//继续下载
@IBAction func resumeClick(sender: AnyObject) {
    
    //防止下载任务被重复创建
    if reusmeData == nil {
        print("没有续传数据")
        return
    }
     // 使用续传数据创建下载任务 - 一旦使用续传数据新建了下载任务,续传就没用了!
    downloadTask = Session.downloadTaskWithResumeData(reusmeData)
    downloadTask.resume()
    
    //释放续传数据
    reusmeData = nil
}

}

//MRAK: NSURLSessionDownloadDelegate方法

extension ViewController:NSURLSessionDownloadDelegate{


// 下载完成 iOS 8.0以后 必须实现
internal func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL){
    
    //下载完成 location,文件保存地址
    //在此代理方法完成之后,下载的文件会删除,需要立即保存
    print(location.path!)
    //拷贝文件到cache
    var  filePath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.CachesDirectory, NSSearchPathDomainMask.UserDomainMask, true).last! as NSString
    filePath = filePath.stringByAppendingPathComponent("hello.mp4")
    
    let fileMan = NSFileManager.defaultManager()
    do{
        try fileMan.copyItemAtPath(location.path!, toPath: filePath as String)
    }catch{}


    // 取消session 如果不取消session会造成内存泄漏
      self.Session.finishTasksAndInvalidate()
}
// 进度的方法,iOS 7.0 必须实现,在 iOS 8.0以后 可选
/**
 bytesWritten               本次下载字节数
 totalBytesWritten          已经下载字节数
 totalBytesExpectedToWrite  总下载字节数
 */
 internal func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64){
    
    let progress = Float(totalBytesWritten)/Float(totalBytesExpectedToWrite)
    
    print(progress)
    dispatch_async(dispatch_get_main_queue()) {
        
        self.progressVeiw.progress = progress
    }
}


// 续传的方法,iOS 7.0 必须实现,在 iOS 8.0 以后可选
 internal func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didResumeAtOffset fileOffset: Int64, expectedTotalBytes: Int64){
    
       print(#function)
}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,532评论 25 708
  • 控制反转将传统上由程序代码直接操控的对象调用权交给容器,通过容器来实现对象的装配和管理。控制反转是一个概念,一种思...
    神的孩子都该跳舞阅读 166评论 0 0
  • 针对刚刚在工程里添加cocoapods,并且已经下载了几个第三方库, 但是当我们引用其头文件时,发现不会提示,会不...
    LOVE婷阅读 353评论 0 0
  • 两个性格迥异甚至相反的人成为朋友,很有趣,也有点悲哀。Ta能为你打开各种美丽新世界的大门,也能用诡异的逻辑和结论刺...
    magicjam阅读 280评论 0 0
  • 01不矫情的人 前些天,我在朋友圈看到一条状态 “从没有矫情过,可是今天回去外婆给我留的这盏灯,却让我觉得很幸福。...
    af5768778b6d阅读 500评论 0 1