玩轉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.pswp.cn/news/258288.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/258288.shtml
英文地址,請注明出處:http://en.pswp.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 這樣的版本范圍…