Swift网络开发之NSURLSession学习笔记

先上效果图;

      

功能:

-单个任务下载

-暂停下载任务

-取消下载任务

-断点下载

-显示下载进度及速度

-多任务下载

-分别控制各个任务

在如今移动互联网的浪潮中,手机APP越来越依赖网络通讯来交互数据。今天我们就来分享下如何通过使用NSURLSession这个Apple官方提供的网络接口实现文件下载的思路。

NSURLSsession

先来介绍下NSURLSession这个接口。NSURLSession是苹果在WWDC2013上推出的用于替代它的前辈NSURLConnection的。

与NSURLConnection类似,除了同名类NSURLSession,NSURLSession也是指一组相互依赖的类。NSURLSession包括与之前相同的组件,例如NSURLRequest, NSURLCache等。NSURLSession的不同之处在于,它把 NSURLConnection替换为NSURLSession, NSURLSessionConfiguration,以及3个NSURLSessionTask的子类:NSURLSessionDataTask, NSURLSessionUploadTask, 和NSURLSessionDownloadTask。

与NSURLConnection相比,NSURLSession最直接的改善就是提供了配置每个会话的缓存,协议,cookie和证书政策(credential policies),甚至跨应用程序共享它们的能力。这使得框架的网络基础架构和部分应用程序独立工作,而不会互相干扰。每一个NSURLSession对象都是根据一个NSURLSessionConfiguration初始化的,该NSURLSessionConfiguration指定了上面提到的政策,以及一系列为了提高移动设备性能而专门添加的新选项。

NSURLSession的另一重要组成部分是会话任务,它负责处理数据的加载,以及客户端与服务器之间的文件和数据的上传下载服务。NSURLSessionTask与NSURLConnection是及其相似的,因为它负责加载数据,而主要的区别在于,任务共享它们父类NSURLSession的共同委托(common delegate)。

NSURLSession支持以下三种会话模式:

1、默认会话模式(default):默认模式,基于磁盘缓存的持久化策略,使用用户keychain中保存的证书进行认证授权。

2、瞬时会话模式(ephemeral):不储存任何数据在磁盘中,所有数据都保存在RAM中,当会话结束后,缓存数据将被清空。

3、后台会话模式(background):该模式类似于默认模式,只是将上传和下载移至后台处理,需要一个提供一个String用于标识后台会话。

NSURLSession同时也提供了大量的配置选项:

 

配置完会话类型后,就可以获取NSURLSession对象了。获取对象的方法有以下几种:

1、sharedSession获取的会话使用的是默认配置(default),全局共享的Cookies,Cache和证书。

2、使用构造器构造一个指定配置的会话对象。

3、 使用构造器构造一个指定配置对象,并指定代理及代理列队。

获取完会话对象后就该给对象一个会话任务了。在这里是通过建立一个会话任务对象来实现布置任务的。在一个会话中,NSURLSession支持三种会话任务:

1、数据任务(NSURLSessionDataTask)

使用NSData对象来发送和接收数据。数据任务可以分片返回数据,也可以通过完成处理器一次性返回数据。由于数据任务不存储数据到文件,所以不支持后台会话。

2、上传任务(NSURLSessionUploadTask)

通常以文件的形式发送数据,支持后台上传。

3、任务(NSURLSessionDownloadTask)

以文件的形式接收数据,当程序不运行时支持后台下载

获得任务对象后,就可以对它进行如下操作:

通过对NSURLSession的简单介绍,大家应该对其有了歌简单的认识,接下就来介绍下如何实现本文开始阶段所展示Demo的所有功能。

Demo详解

先做一些准备工作:

创建一个用于存放下载数据信息的struct DownloadData

创建一个代理协议,之后会介绍它的用处

接着我们开始建立一个自己的DownloadTask类,用来实现下载DownloadData,并提供暂停任务、断点下载、取消任务、实时更新下载进度及速度等功能:

我们先来定义一些属性,

其中,

代理是用于触发之前协议中所定义的方法的,

数组和计时器涌来计算下载速度的,

下载任务id是为了方便管理多个任务。

接着是构造器,

通过构造器我们将从外部获得DownloadData,id及delegate。

完成了这些后,就是编写下载方法了,

这里将自身设置为NSURLSession代理后,就需要在类中遵循NSURLSessionDownloadDelegate协议,并实现其方法。

在这里我实现如下方法,

当然,在构造task时也可以使用带block的构造器,将task完成后所要执行的操作通过闭包的方式传给task。这样做的话在定义NSURLSession中就无需设置代理了。但是,不使用代理的方法是无法获取到下载任务的实时信息的,故要获取下载进度及速度的话,还是应该使用NSURLSession代理。

如果completionhandler 闭包和 didFinishDownloadingToURL 方法同时存在的话,优先执行completionhandler,并会忽略didFinishDownloadingToURL方法。

下面是实现实时速度更新的方法,

然后是暂停任务方法,

这里要注意的是,cancelByProducingResumeData 生成的NSData中包含的并不是之前所下载的数据,而是记录下载产生的临时文件的位置及下载到什么进度的信息,所以并不会占用很大的内存。

任务暂停后,将此次任务清空。

最后是取消任务方法,

清空记录下载信息数据文件后,再次开始任务就不能继续从之前断开的位置继续下载了。

以上就是DownloadTask类的全部内容了, 最后就是建立一个UI调用下DownloadTask,看看这个类在实际使用中的效果如何。

UI:

从0-5依次编号控件,包括1个progressView,2个label,3button,并把他们分别放入collection中,如图:

定义一个taskCollection用于存放所有task,如图:

初始化界面,并定义6个DownloadTask:

替3种button分别添加方法:

最后实现DownloadTaskDelegate代理方法,用于更新UI:

至此,Demo部分讲解全部完工了。

总结

这篇博文主要是本人对NSURLSession学习后的一些心得,及介绍了下如何通过NSURLSession实现,多任务下载,断点下载等功能。需要注意的是,由于NSURLSession采用的是“异步阻塞”模型,所以在实现DownloadTaskDelegate代理方法更新UI时需要将线程切回主线程。

在下一步的学习计划中,准备着手研究如何控制最大下载任务个数及下载优先级等功能,并尝试将所有功能进行封装。

时间: 2024-10-05 12:43:54

Swift网络开发之NSURLSession学习笔记的相关文章

android开发之Notification学习笔记

今天总结了一下Notification的使用,与大家分享一下. MainActivity.java: 本文参考:http://www.jb51.net/article/36567.htm,http://www.cnblogs.com/linjiqin/archive/2011/12/14/2288074.html public class MainActivity extends Activity { private Button btn; private NotificationManager

android开发之broadcast学习笔记

android中的广播用的太多了,今天稍微总结一下. 按注册方式分为两种: 1.静态注册广播: 静态注册广播就是在androidManifest.xml文件中注册广播,假设我们要实现这样一个效果,在一个activity上点击按钮,发送一条广播,这条广播弹出一个toast,显示"静态"二字. 先看看广播接受者: public class MyBroadcast extends BroadcastReceiver { @Override public void onReceive(Cont

Cocos2d-x游戏开发之Lua学习笔记

下载链接 什么是Cocos2d-x 一个开源的移动2D游戏框架,MIT许可证下发布. 可以利用C++.Lua及Javascript来进行部署. 跨平台:iOS,Android,Blackberry,Tizen等. 使用Cocos开发的应用 版权声明:本文原创,转载请注明出处:http://blog.csdn.net/zhoumushui

NSURLSession学习笔记

NSURLSession学习笔记(一)简介 一.URL Session的基本概念 1.三种工作模式: 默认会话模式(default):工作模式类似于原来的NSURLConnection,使用的是基于磁盘缓存的持久化策略,使用用户keychain中保存的证书进行认证授权. 瞬时会话模式(ephemeral):该模式不使用磁盘保存任何数据.所有和会话相关的caches,证书,cookies等都被保存在RAM中,因此当程序使会话无效,这些缓存的数据就会被自动清空. 后台会话模式(background)

NSURLSession 学习笔记

NSURLSession 学习笔记 一:NSURLSession 类似之前的NSURLConnection, 可配置每个session的 cookie,证书等网络连接配置信息 NSURLSessionConfiguration 包含三大任务 :NSURLSessionTask--(NSURLSessionDataTask,NSURLSessionUploadTask,NSURLSessionDownloadTask) 常用api @interface NSURLSession : NSObjec

Android网络开发之用tcpdump抓包

Android开发过程中,当涉及到网络通信的时候,有一些字段需要抓包获取.我之前因为SSDP设备发现的包头格式没有写对,经过抓包分析和标准包头对比发现了这个困扰我很久的问题.总之,掌握在Android手机里面抓包是很有必要的. 准备工作:Android系统的手机,网络环境,tcpdump,破解手机root权限,建议最好在手机里面安装RE文件管理器并且给root权限.具体步骤如下: 首先,通过adb工具将tcpdump推送到手机,tcpdump的下载地址为:http://www.strazzere

Qt网络开发之QNetworkAccessManager 及 qt4使用QUdpSocket发送数据报datagrams

一:Qt网络开发之QNetworkAccessManager  (http://m.blog.csdn.net/blog/u010002704/41355917) 一个应用程序,一个QNetworkAccessManager就足够了 每一个回复QNetworkReply都需要删除,否则会出现内存泄露,根据Qt的帮助文档,在接收完数据的槽中使用deleteLater(),防止内存泄露. 二:Qt4使用QUdpSocket发送数据报datagrams UDP服户端绑定广播[喝小酒的网摘]http:/

NSURLSession学习笔记(三)Download Task

NSURLSession的Download Task用于完成下载任务,本文介绍如何创建断点续传的下载任务和后台下载任务. 我们直接从分析Demo入手: 故事板如下: 只有一个View Controller,用于创建各种下载任务,并将下载后的图片显示到视图上,下载过程中会更新下载进度. 头文件代码如下: [objc] view plaincopy #import <UIKit/UIKit.h> @interface ViewController : UIViewController <NS

NSURLSession学习笔记(一)简介

一.URL Session的基本概念 1.三种工作模式: 默认会话模式(default):工作模式类似于原来的NSURLConnection,使用的是基于磁盘缓存的持久化策略,使用用户keychain中保存的证书进行认证授权. 瞬时会话模式(ephemeral):该模式不使用磁盘保存任何数据.所有和会话相关的caches,证书,cookies等都被保存在RAM中,因此当程序使会话无效,这些缓存的数据就会被自动清空. 后台会话模式(background):该模式在后台完成上传和下载,在创建Conf