文章分享至我的个人技术博客: 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
, UITableViewCell
和UISearchBar
, 就完事了, 布局的代码都在项目里, 由于个人没有什么艺术细胞, 所以界面略丑, 大家凑合着看吧.
项目架构
为了让大家阅读起来比较方便和清晰, 我这里用了我一向习惯的MVVM
架构模式, 虽然文件多了点, 但每个文件的代码都保证在了200
行之内, 个人感觉看起来还是比较舒服的.
实现下载
在项目里面有一个QueryService
和一个DownloadService
, 都是负责管理下载和一些网络请求, 由于代码太多了, 这里我就讲讲思路好了.
QueryService
: 负责实现用UISearchBar
的搜索网络请求, 当UISearchBar
输入关键字的时候, 通过指定的URL
和Query
拼接成一条有效的搜索链接, 并且通过NSURLSessionDataTask
进行网络请求, 成功后会进行数据的解析, 并且通过SearchModel
进行组装, 然后添加到一个NSMutableArray
对象里, 最后UITableView
会通过这个NSMutableArray
作为数据源来刷新整个UITableView
.
DownloadService
: 负责实现UITableViewCell
通过DownloadModel
点击开始下载, 暂停, 恢复下载, 取消下载等等操作.
当然这里我们还需要实现一个叫做NSURLSessionDownloadDelegate
和 NSURLSessionDelegate
两个协议, 分别实现:
// 下载完成后的操作方法
- (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讲解(三)