URL Session(NSURLSessionDownloadTask)

URL Session(NSURLSession)

URL Session(NSURLSessionDataTask))

URL Session(NSURLSessionUploadTask)

URL Session(NSURLSessionDownloadTask)

URL Session(Cache).md

URL Session(Cookie)


在上一篇博文《URL Session(NSURLSessionUploadTask)》为大家讲解了上传文件,在这篇博文为大家带来下载功能,并且支持并发下载。

下载文件使用的类是NSURLSessionDownloadTask。

1 NSURLSessionDownloadTask

NSURLSessionDownloadTask是NSURLSessionTask的子类,主要处理网络中的下载业务。

下载下来的文件会存储到一个临时文件中,当应用退出后会被销毁。如果你想保存这些数据,需要你将这些数据移动到持久化目录,如document。

在NSURLSessionTask中有以下三个方法。

// 开始任务
public func resume()
// 挂起任务
public func suspend()
// 取消任务
public func cancel()

前面使用了resume()方法,今天会使用suspend()和cancel()为大家带来暂停下载和取消下载的功能。

2 NSURLSessionDownloadDelegate

在下载的时候,绝大多数的情况都是使用后台下载的。因为用户不可能长时间在一个页面等待下载。后台下载的监听就需要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)

3 后台下载

3.1 YJDownloadTaskVC类

下载测试我们使用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。

3.2 创建NSURLSession

在这里我们会以单例的模式创建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
}

3.3 NSURLSessionDelegate代理实现

通过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?)方法。不管成功还是失败,任务结束后都会调用它。

3.4 业务实现

3.4.1 并发测试

这里是从网上下载一个高清图片,并在队列中连续下载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()
    }
}

3.4.2 刷新

刷新的实质是设置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)
}

3.4.3 开始下载

// MARK: 开始下载
func downloadTaskResume() {
    self.downloadTask?.resume()
}

3.4.4 暂停下载

// MARK: 暂停下载
func downloadTaskSuspend() {
    self.downloadTask?.suspend()
}

3.4.5 取消下载

// 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值