廢話不多說(shuō)直接上代碼
//下載進(jìn)度
@IBOutlet weak var progressVeiw: UIProgressView!
// 全局網(wǎng)絡(luò)會(huì)話 - 管理所有的網(wǎng)絡(luò)請(qǐng)求
lazy var Session :NSURLSession = {
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
let sessiontem = NSURLSession(configuration: configuration, delegate: self, delegateQueue: nil)
return sessiontem
}()
// 下載任務(wù)
var downloadTask : NSURLSessionDownloadTask!
//續(xù)傳數(shù)據(jù)就
var reusmeData:NSData!
override func viewDidLoad() {
super.viewDidLoad()
}
//具體操作
//開(kāi)始下載
@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("不需要暫停下載任務(wù)")
return
}
downloadTask.cancelByProducingResumeData { (data:NSData?) in
// 保存續(xù)傳數(shù)據(jù)
self.reusmeData = data!
//釋放下載任務(wù) 防止在次暫停
self.downloadTask = nil
}
}
//繼續(xù)下載
@IBAction func resumeClick(sender: AnyObject) {
//防止下載任務(wù)被重復(fù)創(chuàng)建
if reusmeData == nil {
print("沒(méi)有續(xù)傳數(shù)據(jù)")
return
}
// 使用續(xù)傳數(shù)據(jù)創(chuàng)建下載任務(wù) - 一旦使用續(xù)傳數(shù)據(jù)新建了下載任務(wù),續(xù)傳就沒(méi)用了鲤竹!
downloadTask = Session.downloadTaskWithResumeData(reusmeData)
downloadTask.resume()
//釋放續(xù)傳數(shù)據(jù)
reusmeData = nil
}
}
//MRAK: NSURLSessionDownloadDelegate方法
extension ViewController:NSURLSessionDownloadDelegate{
// 下載完成 iOS 8.0以后 必須實(shí)現(xiàn)
internal func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL){
//下載完成 location,文件保存地址
//在此代理方法完成之后,下載的文件會(huì)刪除,需要立即保存
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會(huì)造成內(nèi)存泄漏
self.Session.finishTasksAndInvalidate()
}
// 進(jìn)度的方法浪读,iOS 7.0 必須實(shí)現(xiàn),在 iOS 8.0以后 可選
/**
bytesWritten 本次下載字節(jié)數(shù)
totalBytesWritten 已經(jīng)下載字節(jié)數(shù)
totalBytesExpectedToWrite 總下載字節(jié)數(shù)
*/
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
}
}
// 續(xù)傳的方法辛藻,iOS 7.0 必須實(shí)現(xiàn)碘橘,在 iOS 8.0 以后可選
internal func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didResumeAtOffset fileOffset: Int64, expectedTotalBytes: Int64){
print(#function)
}
}