URL Session(NSURLSession)
URL Session(NSURLSessionDataTask))
URL Session(NSURLSessionUploadTask)
URL Session(NSURLSessionDownloadTask)
URL Session(Cache).md
URL Session(Cookie)
在上一篇博文《URL Session(NSURLSessionUploadTask)》为大家讲解了上传文件,在这篇博文为大家带来下载功能,并且支持并发下载。
下载文件使用的类是NSURLSessionDownloadTask。
NSURLSessionDownloadTask是NSURLSessionTask的子类,主要处理网络中的下载业务。
下载下来的文件会存储到一个临时文件中,当应用退出后会被销毁。如果你想保存这些数据,需要你将这些数据移动到持久化目录,如document。
在NSURLSessionTask中有以下三个方法。
// 开始任务
public func resume()
// 挂起任务
public func suspend()
// 取消任务
public func cancel()
前面使用了resume()方法,今天会使用suspend()和cancel()为大家带来暂停下载和取消下载的功能。
在下载的时候,绝大多数的情况都是使用后台下载的。因为用户不可能长时间在一个页面等待下载。后台下载的监听就需要NSURLSessionDownloadDelegate实现了。在NSURLSessionDownloadDelegate中有如下几个方法。
// MARK: 下载完成
public func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL)
// MARK: 下载中(会多次调用,可以记录下载进度)
optional public func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64)
// MARK: 重新开始下载
optional public func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didResumeAtOffset fileOffset: Int64, expectedTotalBytes: Int64)
下载测试我们使用YJDownloadTaskVC类。
//
// YJDownloadTaskVC.swift
// NSURLSession
//
// CSDN:http://blog.csdn.net/y550918116j
// GitHub:https://github.com/937447974/Blog
//
// Created by yangjun on 15/12/3.
// Copyright © 2015年 阳君. All rights reserved.
//
import UIKit
// NSURLSessionDownloadTask 下载
class YJDownloadTaskVC: UIViewController, NSURLSessionDownloadDelegate {
/// 下载器
private var downloadTask: NSURLSessionDownloadTask?
override func viewDidLoad() {
super.viewDidLoad()
// 相关按钮
// 刷新
let refreshItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Refresh, target: self, action: "downloadTaskRefresh")
// 开始
let resumeItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Play, target: self, action: "downloadTaskResume")
self.navigationItem.leftBarButtonItems = [refreshItem, resumeItem]
// 暂停
let suspendItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Pause, target: self, action: "downloadTaskSuspend")
// 取消
let cancelItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Cancel, target: self, action: "downloadTaskCancel")
self.navigationItem.rightBarButtonItems = [cancelItem, suspendItem]
}
// MARK: - action
// MARK: 刷新
func downloadTaskRefresh() {
}
// MARK: 开始下载
func downloadTaskResume() {
}
// MARK: 暂停下载
func downloadTaskSuspend() {
}
// MARK: 取消下载
func downloadTaskCancel() {
}
}
这里已经创建了4个按钮。刷新、开始下载、暂停下载和取消下载,并且创建了一个全局属性downloadTask指向一个NSURLSessionDownloadTask。
在这里我们会以单例的模式创建NSURLSession,这样可以在调度器里面并发请求服务器。
// MARK: - 后台下载
// MARK: 获取后台下载的session
private func backgroundSession() -> NSURLSession{
struct Static {
static var onceToken: dispatch_once_t = 0
static var session: NSURLSession!
}
//var static session: NSURLSession!
dispatch_once(&Static.onceToken, { () -> Void in
let sessionConfiguration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier("com.downloadTask.URLSession")
sessionConfiguration.timeoutIntervalForRequest = 20// 请求超时时间
sessionConfiguration.discretionary = true // 系统自动选择最佳网络下载
sessionConfiguration.HTTPMaximumConnectionsPerHost = 5// 限制每次最多5个连接
Static.session = NSURLSession(configuration: sessionConfiguration, delegate: self, delegateQueue: nil)//指定配置和代理
})
return Static.session
}
通过NSURLSessionDelegate代理,我们能监听下载的进度,以及下载后的链接和下载中的错误。
// MARK: - NSURLSessionDelegate
// MARK: 下载完成
func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL) {
// 下载完成的地址
print(location)
}
// MARK: 下载中(会多次调用,可以记录下载进度)
func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) {
let progress: Float = Float(totalBytesWritten) / Float(totalBytesExpectedToWrite)
print("\(totalBytesExpectedToWrite)--\(totalBytesWritten)--\(progress)")
}
// MARK: 重新开始下载
func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didResumeAtOffset fileOffset: Int64, expectedTotalBytes: Int64) {
let progress: Float = Float(fileOffset) / Float(expectedTotalBytes)
print("已下载\(progress)")
}
// MARK: - NSURLSessionTaskDelegate
// MARK: 任务完成,不管是否下载成功
func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?) {
print("错误: \(error)")
}
为了监听下载中的错误,我们实现了NSURLSessionTaskDelegate的func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?)
方法。不管成功还是失败,任务结束后都会调用它。
这里是从网上下载一个高清图片,并在队列中连续下载10张照片,由于我们session中设置了并发数为5个,你会发现控制台输出只会同时下载5张照片。
// MARK: - 队列测试
func testQueue() {
let usrString = "http://g.hiphotos.baidu.com/image/pic/item/472309f790529822c4ac8ad0d5ca7bcb0a46d402.jpg"
let url = NSURL(string: usrString)
let request = NSMutableURLRequest(URL: url!)
let session = self.backgroundSession()
// 并发下载10个文件
for _ in 0..<10 {
session.downloadTaskWithRequest(request).resume()
}
}
刷新的实质是设置downloadTask。
// MARK: - action
// MARK: 刷新
func downloadTaskRefresh() {
// 这是一张高清图片
let usrString = "http://g.hiphotos.baidu.com/image/pic/item/472309f790529822c4ac8ad0d5ca7bcb0a46d402.jpg"
let url = NSURL(string: usrString)
let request = NSMutableURLRequest(URL: url!)
let session = self.backgroundSession()
self.downloadTask = session.downloadTaskWithRequest(request)
}
// MARK: 开始下载
func downloadTaskResume() {
self.downloadTask?.resume()
}
// MARK: 暂停下载
func downloadTaskSuspend() {
self.downloadTask?.suspend()
}
// MARK: 取消下载
func downloadTaskCancel() {
self.downloadTask?.cancel()
}
到这里整个项目就结束了,你可以运行项目,点击相关按钮查看下载的效果。
URL Session Programming Guide
NSURLSessionDownloadTask Class Reference
时间 | 描述 |
---|---|
2015-12-05 | 博文完成 |
2015-12-12 | 更改链接 |
CSDN:http://blog.csdn.net/y550918116j
GitHub:https://github.com/937447974/Blog