文档章节

[Swift]Swift网络开发之NSURLSession学习笔记

猴亮屏
 猴亮屏
发布于 2016/02/23 16:46
字数 1751
阅读 85
收藏 0

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时需要将线程切回主线程。
在下一步的学习计划中,准备着手研究如何控制最大下载任务个数及下载优先级等功能,并尝试将所有功能进行封装。

本文转载自:http://www.3fwork.com/b209/000064MYM011035/

猴亮屏

猴亮屏

粉丝 38
博文 542
码字总数 60882
作品 4
北京
Android工程师
私信 提问
2017年年终总结

前言 不知不觉,2017年又接近尾声了,又到了该写年终总结的时候了,往年这个时候都会熙熙攘攘,各大平台提早预热过年的气氛,而今年显得格外的平静,这可能正如我的现在的心境,波澜而不惊!...

韩俊强
2018/01/03
0
0
对于AlamoFire几点思考

本文由CocoaChina--BYB1132(论坛ID)翻译 原文:Thoughts On AlamoFire--Swift’s AFNetworking Implementation HTTP协议就是现代开发的同义词,对于有经验的iOS开发者来说, 熟悉并尽可能使...

刘星石
2016/03/02
26
0
Swift中的HTTP请求

iOS开发中大部分App的网络数据交换是基于HTTP协议的。本文将简单介绍在Swift中使用HTTP进行网络请求的几种方法。 注意:网络请求完成后会获得一个NSData类型的返回数据,如果数据格式为JSON,...

evil_01
2016/05/13
94
0
iOS 图像下载扩展--Swift-moa

moa 是用 Swift 写成的 iOS 图像下载库,通过设置 属性,它允许在 下载和显示图片。 特性: 图像异步下载。 使用 NSURLSession 网络和缓存。 允许配置缓存大小和政策。 可以在没有 UIImageV...

sikkx
2015/06/02
323
0
Alamofire的设计之道

前言: Alamofire是一个由Swift编写的优雅的网络开发框架。 大部分用Swift编写的iOS App的网络模块都是基于Alamofire的。作为Swift社区最活跃的几个项目之一,有许多开发者在不断的对其进行完...

黄文臣
2017/06/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

为什么Netty的FastThreadLocal速度快

前言 最近在看netty源码的时候发现了一个叫FastThreadLocal的类,jdk本身自带了ThreadLocal类,所以可以大致想到此类比jdk自带的类速度更快,主要快在什么地方,以及为什么速度更快,下面做一...

ksfzhaohui
6分钟前
2
0
资治通鉴解析:无论什么条件,要挟权力做出承诺,都会被清算

电影《满城尽带黄金甲》里有句经典的名言“朕赐给你的,才是你的。朕不给你的,你不能抢。”之所以这段话有名,核心的就是,它揭示了这样一个权力心思:无论什么情况,权力的行使,都不愿意受...

太空堡垒185
10分钟前
1
0
CSS技巧之向下箭头

本文转载于:专业的前端网站➫CSS技巧之向下箭头 思路: 使用◇符号(可在输入法的软键盘找到该符号),使用定位选择位置,并隐藏溢出的上半部分 细点: 1.使用i标签的楷体属性把◇变大 2.给i...

前端老手
27分钟前
1
0
SpringCloud alibaba微服务之NACOS多环境配置整合

前言 伴随着spring cloud alibaba 登上主板以后,我就去了解下感觉还是蛮不错的。说实话第一次看见Nacos好长一段时间连读法都不知道...(/nɑ:kəʊs/)。按照官方的话说Nacos是:一个更易于...

攻城狮-飞牛
29分钟前
2
0
tcpdump

tcpdump -A -s0 port 21011 -i any (1)tcp: ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型 (2)-i eth1 : 只抓经过接口eth1的包 (3)-t : 不显...

mskk
34分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部