文章分享至我的個人技術博客: 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講解(三)