玩转iOS开发:NSURLSession讲解(三)

文章分享至我的个人技术博客: https://cainluo.github.io/14986211698053.html


前言

虽然前面两讲都是说了NSURLSession的一些理论上的知识, 但我们现在起码对NSURLSession有个大概的了解, 并不会像一开始的那样, 一脸懵逼的看着, 这个请求是什么鬼, 那个方法是什么鬼, Task是什么东西, 如果没有去看的朋友们可以去看看前面两讲玩转iOS开发:NSURLSession讲解(一)和 玩转iOS开发:NSURLSession讲解(二), 大神就随意啦.

这里的工程是仿照RayWenderlich(需要翻墙)的一篇文章URLSession Tutorial: Getting Started, 喜欢看原文或者是Swift的朋友也可以去看看, 我这个是Objective-C版本的.

注意: 本工程是在Xcode 9 beta 2, iOS 11的环境下运行的.


搭建界面

这里我要说明一下, 原文里的界面是使用Storyboard来搭建的, 我这里是使用代码和Masonry, 这里再次和大神表示感谢.

搭建好的界面也很简单, 就一个UITableView, UITableViewCellUISearchBar, 就完事了, 布局的代码都在项目里, 由于个人没有什么艺术细胞, 所以界面略丑, 大家凑合着看吧.


项目架构

为了让大家阅读起来比较方便和清晰, 我这里用了我一向习惯的MVVM架构模式, 虽然文件多了点, 但每个文件的代码都保证在了200行之内, 个人感觉看起来还是比较舒服的.

实现下载

在项目里面有一个QueryService和一个DownloadService, 都是负责管理下载和一些网络请求, 由于代码太多了, 这里我就讲讲思路好了.

QueryService: 负责实现用UISearchBar的搜索网络请求, 当UISearchBar输入关键字的时候, 通过指定的URLQuery拼接成一条有效的搜索链接, 并且通过NSURLSessionDataTask进行网络请求, 成功后会进行数据的解析, 并且通过SearchModel进行组装, 然后添加到一个NSMutableArray对象里, 最后UITableView会通过这个NSMutableArray作为数据源来刷新整个UITableView.

DownloadService: 负责实现UITableViewCell通过DownloadModel点击开始下载, 暂停, 恢复下载, 取消下载等等操作.

当然这里我们还需要实现一个叫做NSURLSessionDownloadDelegateNSURLSessionDelegate两个协议, 分别实现:

// 下载完成后的操作方法
- (void)URLSession:(NSURLSession *)sessiondownloadTask:(NSURLSessionDownloadTask *)downloadTask
didFinishDownloadingToURL:(NSURL *)location;// 正在下载时的操作方法
- (void)URLSession:(NSURLSession *)sessiondownloadTask:(NSURLSessionDownloadTask *)downloadTaskdidWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite;// 后台下载完成后的方法
- (void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session;
复制代码

这里面的实现可以去SearchSessionDelegate里面看看, 这里就不详细多说了.

整个项目的核心内容就在这里了, 更详细的细节, 大家可以去项目里自己看看哈, 这里就不浪费大家的时间了.

最终的效果:

总结

最后唠叨两句, 由于我这个只是Demo, 里面存在的Bug, 还有不完善的封装请大家多多见谅, 这里顺便推两个优秀的开源下载管理器HWIFileDownload, TCBlobDownload.

如果有童鞋想自己封装一个的话, 也可以去看看这几篇文章MCDownloadManager ios文件下载管理器, 手把手教你封装下载管理器, 还有这个经验贴iOS通用下载管理器-HJMURLDownloader.

祝大家学习愉快.


工程地址:

项目地址: https://github.com/CainRun/iOS-NetWork/tree/master/NSURLSession讲解(三)


最后

码字很费脑, 看官赏点饭钱可好

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/258288.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

轻松搞定面试中的二叉树题目

版权全部,转载请注明出处,谢谢!http://blog.csdn.net/walkinginthewind/article/details/7518888 树是一种比較重要的数据结构,尤其是二叉树。二叉树是一种特殊的树,在二叉树中每一个节点最多有两个子节点,…

李倩星r语言实战_《基于R的统计分析与数据挖掘》教学大纲

《基于R的统计分析与数据挖掘》课程教学大纲课程代码:090542009课程英文名称:R Language and Data Mining课程总学时:32讲课:32实验:0上机:0适用专业:应用统计学大纲编写(修订)时间:…

自动化测试小结

最近差不多一年从事自动化的测试工作,从开始对自动化一点都不了解到现在能从实现用例、手动命令行执行用例、自制工具来执行用例,感觉进步还是有的。 自动化测试对于手动测试应该是有不小的优势的,虽然在自动化的用例实现中刚开始的时候会显得…

python地理可视化_【Python教程】地理可视化之二

Basemap是Matplotlib的一个子包,负责地图绘制。昨天的推送对如何绘制风向图进行了描述,本文再次利用该包简单介绍如何绘制海洋及海冰温度彩色图示,该图常见于NOAA官网。具体操作如下:导入命令1)设置工作环境并导入程序包%cd "…

寻找白板上的便签条

问题来源:http://answers.opencv.org/question/162480/contour-detection-for-gray-stickers-on-white-background/ 题目的大概意思就是这样的白板,寻找上面的各种便签条。我找到了橘色的,结果是这样代码是这样Mat src imread("gray-st…

LeetCode Permutations

原题链接在这里:https://leetcode.com/problems/permutations/ 题目: Given a collection of distinct numbers, return all possible permutations. For example,[1,2,3] have the following permutations:[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2]…

去除内存上的警告,避免程序崩掉

# pragma clang diagnostic push # pragma clang diagnostic ignored "-Warc-performSelector-leaks" [self performSelector:callFunc withObject:array[1]]; # pragma clang diagnostic pop 使用原理:将出现警告的代码加入内存栈中转载于:https://www.c…

opengl2 vtk 编译_编译和使用VTK时值得注意的点(待续)

最近的一个项目中需要使用VTK,于是开始了VTK的漫漫编译之路。长篇大论的编译步骤网上数不胜数,在这里不再细说,可自行google。这里主要说一些在编译过程中需要注意的地方,以免走歪路。1、使用cmake进行第一次configure的时候需要选…

gg

转载于:https://www.cnblogs.com/lyzuikeai/p/7091206.html

二:Go编程语言规范-类型

1.类型 布尔值,数值与字符串类型的实例的命名是预声明的。 数组,结构,指针,函数,接口,切片,映射和信道这些复合类型可由类型字面构造。 每个类型 T 都有一个 基本类型:若 T 为预声明…

HDU 1728 逃离迷宫

这道题做的我想哭啊。。WA了将近十次了吧 一开始我用数组模拟的队列,后来和老大代码对拍,感觉改的是基本都一模一样了,还是WA 实在没有办法了,改用queue了 题目里的x是列y是行,和代码里的反过来的,要注意&a…

Nginx(六)-- 配置文件之Gzip

1.概念及作用 Gizp主要对内容、静态文件做压缩,用来提升网站访问速度,节省带宽。 2.使用方法 gzip既可以配置在server中,也可以配置在server外,此处配置在server中,如下: 说明:  gizp on|off 是…

误码率越高越好还是越低越好_夜间护理步骤越多越好还是越少越好?NFF

现在很多人都知道了夜晚是护肤的黄金护肤时间,有些很聪明的姐妹就从夜晚着手,使用很多种护肤品,希望达到事半功倍的效果,但好皮肤不常有,皮肤问题却常有!既然如此,不少人就问了,夜间…

【随机森林】random forests 简单介绍

Random Forest,顾名思义 Random 就是随机抽取; Forest 就是说这里不止一棵树,而由 一群决策树组成的一片森林 ,连起来就是用随机抽取的方法训练出一群决策树来完成分类任务。RF用了两次随机抽取, 一次是对训练样本的随机抽取; 另一…

侧边工具开发2

1.使用图片的形式会出现大量的图片&#xff0c;影响性能&#xff0c;而且不易修改&#xff0c;所有使用图标加文字的形式进行 <a href"javacript:;" class"toolbar-item"><span class"toolbar-btn"><i class"toolbar-icon&q…

斐波那契?

斐波那契&#xff1f; Time Limit: 1000ms Memory limit: 32768K 有疑问&#xff1f;点这里^_^ 题目描述 给出一个数列的递推公式&#xff0c;希望你能计算出该数列的第N个数。递推公式如下&#xff1a; F(n)F(n-1)F(n-2)-F(n-3). 其中&#xff0c;F(1)2, F(2)3, F(3)5. 很熟…

clustalw序列比对_序列比对之Clustalx与Clustalw使用指南

相关专题这几天实验需要做多序列比对&#xff0c;很久不做了&#xff0c;一时之间不知道如何使用clustal这个工具了。在网上搜集了一些资料&#xff0c;做个整理&#xff0c;总结了Clustalx和Clustalw的使用&#xff0c;省得以后久不使用又生疏了&#xff0c;又要去整理了&…

信息安全系统设计基础第三周学习总结—20135227黄晓妍

一.Vim编辑器 1.Vim的六种模式 2.Vim三种常用模式的使用方式&#xff0c;以及三者的切换。打开Vim即默认进入普通模式&#xff0c;按i进入插入模式&#xff0c;按esc从插入模式退出普通模式&#xff0c;再按&#xff1a;进入命令行模式。 普通模式下游标的移动 按键 说明 h …

关于指定日期的获取

java使用Calendar类获得指定日期 关于指定日期的获取&#xff0c;是根据指定日期和当前日期相差的天数&#xff0c;然后使用set方法设置Calendar.DAY_OF_MONTH的值。Calendar cal Calendar.getInstance();cal.set(Calendar.DAY_OF_MONTH, cal.get(Calendar.DAY_OF_MONTH) - da…

nodejs的package.json依赖dependencies中 ^ 和 ~ 的区别

nodejs的package.json定义了一个模块&#xff0c;包括其依赖关系的一个简单的JSON文件&#xff0c;该文件可以包含多个不同的指令来告诉Node包管理器如何处理模块。 dependencies则表示此模块依赖的模块和版本&#xff0c;其中常常可以看到类似 ^1.2.0 或 ~1.2.0 这样的版本范围…