這篇博客分為五個部分碗降,前面四個部分是對NSURLSession的總結(jié);最后一個部分通過一個音樂播放器的Demo來進行實際操練摄乒。這個音樂播放器有以下功能:查詢歌曲--下載歌曲--保存并播放歌曲--查看下載過程--繼續(xù)暫停取消下載歌曲。
#1 NSURLSession簡介
1.NSURLSession是蘋果為我們提供的一套新的網(wǎng)絡處理庫残黑。
--NSURLSession負責接收和發(fā)送請求;
--NSURLSessionConfiguration負責配置session屬性酒甸;
--Delegate負責監(jiān)聽網(wǎng)絡操作中發(fā)生的事件
--NSURLSessionTask負責實際的工作:獲取數(shù)據(jù)浮声,上傳和下載文件虚婿。
總的說來,NSURLSession通過兩種方式來獲取數(shù)據(jù):通過completion handler或者代理方法泳挥。
2.NSURLSession優(yōu)點在于:
--接口簡單雳锋。不用擔心之前NSURLConnection使用復雜的問題
--能滿足我們的基本的網(wǎng)絡請求需求。(與AFNetWorking沒有區(qū)別羡洁,但一些加強功能除外)
--系統(tǒng)原生提供玷过,不用做任何額外的導入操作,就可直接使用筑煮。
3.與Alamofire對比辛蚊,不足在于:沒有提供很方便的自動數(shù)據(jù)類型轉(zhuǎn)換。比如真仲,Alamofire 中可以自動將服務端返回的 JSON 數(shù)據(jù)識別并解析出來袋马,而使用 NSURLSession 則需要自己來完成。
4.示例
使用NSURLSession.sharedSession()來獲取NSURLSession的實例秸应,然后調(diào)用dataTaskWithURL()方法傳入url虑凛,最后在閉包中處理請求返回的結(jié)果碑宴。
必須手動調(diào)用resume()方法才會開始請求。因為NSURLSession默認是不啟動resume()的桑谍。
#2 NSURLSession詳細接口
NSURLSession本身是不會進行請求的延柠,只有通過創(chuàng)建task的形式進行網(wǎng)絡請求。一個NSURLSession可以創(chuàng)建多個task锣披,并且這些task之間的cache和cookie是共享的贞间。
--NSURLSessionDataTask:這就是剛才創(chuàng)建的data task,它用于讀取服務端的簡單數(shù)據(jù),不如JSON數(shù)據(jù)
--NSURLSessionDownLoadTask:文件下載雹仿。針對大文件的網(wǎng)路請求做了一些處理增热,如:下載進度,斷點續(xù)傳胧辽。
--NSURLSessionUpLoadTask:文件上傳峻仇。供服務端發(fā)送文件類型的數(shù)據(jù)使用。
(1)下載文件示例
使用downloadTaskWithURL方法來下載文件邑商,這個方法的閉包中會接受一個location參數(shù)摄咆,它表示下載好的文件的存放位置。
注意:downloadTaskWithURL會將文件保存在一個臨時目錄中奠骄,location指向這個臨時目錄的位置。如果要持久保存文件番刊,需將此文件從臨時目錄中移動出來含鳞。
(2)上傳文件示例.使用uploadTaskWithRequest方法
#3 NSURLSessionConfiguration
1.為什么需要用NSURLSessionConfiguration?
用NSURLSession.sharedSession()方法創(chuàng)建的實例是全局的,沒有代理對象芹务,功能受限--比如說蝉绷,不能檢測下載速度,不能設置后臺的下載機制枣抱。
所以熔吗,我們需要用NSURLSessionConfiguration對象來配置NSURLSession實例。
NSURLSession定義了兩個配置方法:
--init(configuration:)
--init(configuration:delegate:delegateQueue:)
2.NSURLSessionConfiguration的三個默認初始化方法
--defaultSessionConfiguration:默認配置佳晶,使用全局的緩存桅狠,cookie信息。
--ephemeralSessionConfiguration:私有的Session轿秧。不會對緩存或cookie進行存儲中跌。相當于瀏覽器的隱私模式。
--backgroundSessionConfiguration:當應用切換到后臺時菇篡,網(wǎng)絡操作依然可以繼續(xù)進行漩符。
3.一旦用配置好的 NSURLSessionConfiguration 初始化 NSURLSession 實例后,就不能修改這個 NSURLSession 相關(guān)的配置了驱还。所以嗜暴,一切的配置操作都放在初始化 NSURLSession 之前凸克。
#4 Delegate
--NSURLSessionDelegat作為所有代理的基類,定義了網(wǎng)絡請求最基礎(chǔ)的代理方法
--NSURLSessionTaskDelegate定義的網(wǎng)絡請求任務相關(guān)的代理方法
--NSURLSessionDownloadDelegate用于下載任務相關(guān)的代理方法闷沥,比如查看下載進度
--NSURLSesssionDataDelegate用于普通數(shù)據(jù)任務和上傳任務
#5 Demo
1.查詢歌曲
--聲明一個session常量和一個data task變量
--更新searchBarSearchButtonClicked(_:)方法
運行一下萎战,現(xiàn)在是這樣的!
2.下載歌曲
(1)新建一個文件狐赡,命名為Download撞鹉。
(2) 添加一個變量,來存儲urls和Download之間的映射關(guān)系颖侄。
(3)創(chuàng)建一個download task
思路是:配置session鸟雏,配置delegate,更新開始下載的方法
--在ViewDidLoad()方法前聲明變量.
問題一:lazy修飾符什么作用览祖?表示這個屬性是延遲加載的孝鹊。除了能節(jié)省內(nèi)存分配時間優(yōu)化性能--在需要的時候downloadsSession才被創(chuàng)建出來;更重要的是展蒂,它能讓你在self還沒初始化的時候又活,就能將self作為delegate 參數(shù)傳給構(gòu)造器。
問題二:delegateQueue的參數(shù)為什么是nil锰悼?這能讓session創(chuàng)建一個serial operation queue柳骄,來實現(xiàn)delegate方法和completion handler方法。
--實現(xiàn)NSURLSessionDownloadDelegate方法.當下載完成時箕般,在控制臺輸出“Finished downloading”
--更新開始下載的方法.
3.保存和播放歌曲
當一個download task完成后耐薯,URLSession(_:downloadTask:didFinishDownloadingToURL:)方法提供了臨時文件位置的URL。你需要做的是丝里,在這個方法返回結(jié)果前曲初,將這個URL移到app的沙盒容器目錄中。同樣杯聚,你需要從字典里將正在下載的download移走臼婆,并更新table view。
實現(xiàn)思路是:找出有request url歌曲的index --清除臨時文件位置上的文件--將文件從臨時文件位置復制到本地路徑--移除activeDownloads數(shù)組中的download--更新table view
--添加一個方法幌绍,它會返回在searchResults列表中的歌曲的index颁褂。遍歷searchResults數(shù)組,找出已經(jīng)有url的歌曲傀广。
--更新delegate方法
運行一下痢虹,在console里,你可以看到destinationURL
在模擬器里主儡,點擊下載好的歌曲奖唯,便能進行播放啦!
4. 查看下載進度
--添加代理方法
--更新cell配置糜值。找到tableView(_:cellForRowAtIndexPath:)方法丰捷。
現(xiàn)在歌曲下載是這樣的:
5.暫停坯墨,繼續(xù),取消下載
--添加這三個方法病往。
暫停下載和取消下載的不同之處在于暫停下載還會產(chǎn)生resumeData捣染。
在繼續(xù)下載和暫停下載方法中,isDownLoading作為flag標記停巷,用來表示下載是否已經(jīng)開始耍攘。
--更新cell配置方法。cell有兩個button畔勤,一個button在“resume”和“pause”之間切換蕾各,另外一個button的title為“cancel”。
運行一下内颗,現(xiàn)在是這樣的
完結(jié)钧排。
項目地址:github.com/Paganarchitect/iOS_tutorial_exercises_RayWenderlich.git