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

550 阅读3分钟

文章分享至我的个人技术博客: 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 *)session
      downloadTask:(NSURLSessionDownloadTask *)downloadTask
didFinishDownloadingToURL:(NSURL *)location;

// 正在下载时的操作方法
- (void)URLSession:(NSURLSession *)session
      downloadTask:(NSURLSessionDownloadTask *)downloadTask
      didWriteData:(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讲解(三)


最后

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

微信

支付宝