微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘贴.待开发的功能:1.支持自动生成约束2.开发设置页面3.做一个浏览器插件,支持不需要下载整个工程,可即时操作当前蓝湖浏览页面4.支持Flutter语言模板生成5.支持更多平台,如Sketch等6.支持用户自定义语言模板
现实生活中,我们听到的声音都是时间连续的,我们称为这种信号叫模拟信号。模拟信号需要进行数字化以后才能在计算机中使用。目前我们在计算机上进行音频播放都需要依赖于音频文件。那么音频文件如何生成的呢?音频文件的生成过程是将声音信息采样、量化和编码产生的数字信号的过程,我们人耳所能听到的声音频率范围为(20Hz~20KHz),因此音频文件格式的最大带宽是20KHZ。根据奈奎斯特的理论,音频文件的采样率一般在40~50KHZ之间。奈奎斯特采样定律,又称香农采样定律。...............
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿遍又亿遍,久久不能离开!看着小仙紫姐姐的蹦迪视频,除了一键三连还能做什么?突发奇想,能不能把舞蹈视频转成代码舞呢?说干就干,今天就手把手教大家如何把跳舞视频转成代码舞,跟着仙女姐姐一起蹦起来~视频来源:【紫颜】见过仙女蹦迪吗 【千盏】一、核心功能设计总体来说,我们需要分为以下几步完成:从B站上把小姐姐的视频下载下来对视频进行截取GIF,把截取的GIF通过ASCII Animator进行ASCII字符转换把转换的字符gif根据每
【Android App】实战项目之仿抖音的短视频分享App(附源码和演示视频 超详细必看)
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至2022年4月底。我已经将这篇博客的内容写为论文,上传至arxiv:https://arxiv.org/pdf/2204.10160.pdf欢迎大家指出我论文中的问题,特别是语法与用词问题在github上,我也上传了完整的项目:https://github.com/Whiffe/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset关于自定义ava数据集,也是后台
因为我既对接过session、cookie,也对接过JWT,今年因为工作需要也对接了gtoken的2个版本,对这方面的理解还算深入。尤其是看到官方文档评论区又小伙伴表示看不懂,所以做了这期视频内容出来:视频在这里:本期内容对应B站的开源视频因为涉及的知识点比较多,视频内容比较长。如果你觉得看视频浪费时间,可以直接阅读源码:goframe v2版本集成gtokengoframe v1版本集成gtokengoframe v2版本集成jwtgoframe v2版本session登录官方调用示例文档jwt和sess
【Android App】实战项目之仿微信的私信和群聊App(附源码和演示视频 超详细必看)
用Android Studio的VideoView组件实现简单的本地视频播放器。本文将讲解如何使用Android视频播放器VideoView组件来播放本地视频和网络视频,实现起来还是比较简单的。VideoView组件的作用与ImageView类似,只是ImageView用于显示图片,VideoView用于播放视频。...
采用MATLAB对正弦信号,语音信号进行生成、采样和内插恢复,利用MATLAB工具箱对混杂噪声的音频信号进行滤波
随着移动互联网、云端存储等技术的快速发展,包含丰富信息的音频数据呈现几何级速率增长。这些海量数据在为人工分析带来困难的同时,也为音频认知、创新学习研究提供了数据基础。在本节中,我们通过构建生成模型来生成音频序列文件,从而进一步加深对序列数据处理问题的了解。