NSURLSession應用--音樂播放器

這篇博客分為五個部分碗降,前面四個部分是對NSURLSession的總結(jié);最后一個部分通過一個音樂播放器的Demo來進行實際操練摄乒。這個音樂播放器有以下功能:查詢歌曲--下載歌曲--保存并播放歌曲--查看下載過程--繼續(xù)暫停取消下載歌曲。

Demo

#1 NSURLSession簡介

1.NSURLSession是蘋果為我們提供的一套新的網(wǎng)絡處理庫残黑。

--NSURLSession負責接收和發(fā)送請求;

--NSURLSessionConfiguration負責配置session屬性酒甸;

--Delegate負責監(jiān)聽網(wǎng)絡操作中發(fā)生的事件

--NSURLSessionTask負責實際的工作:獲取數(shù)據(jù)浮声,上傳和下載文件虚婿。

總的說來,NSURLSession通過兩種方式來獲取數(shù)據(jù):通過completion handler或者代理方法泳挥。

NSURLSession

2.NSURLSession優(yōu)點在于:

--接口簡單雳锋。不用擔心之前NSURLConnection使用復雜的問題

--能滿足我們的基本的網(wǎng)絡請求需求。(與AFNetWorking沒有區(qū)別羡洁,但一些加強功能除外)

--系統(tǒng)原生提供玷过,不用做任何額外的導入操作,就可直接使用筑煮。

3.與Alamofire對比辛蚊,不足在于:沒有提供很方便的自動數(shù)據(jù)類型轉(zhuǎn)換。比如真仲,Alamofire 中可以自動將服務端返回的 JSON 數(shù)據(jù)識別并解析出來袋马,而使用 NSURLSession 則需要自己來完成。

4.示例

用NSURLSession進行基本的網(wǎng)絡請求

使用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是共享的贞间。

三種task之間的關(guān)系

--NSURLSessionDataTask:這就是剛才創(chuàng)建的data task,它用于讀取服務端的簡單數(shù)據(jù),不如JSON數(shù)據(jù)

--NSURLSessionDownLoadTask:文件下載雹仿。針對大文件的網(wǎng)路請求做了一些處理增热,如:下載進度,斷點續(xù)傳胧辽。

--NSURLSessionUpLoadTask:文件上傳峻仇。供服務端發(fā)送文件類型的數(shù)據(jù)使用。

(1)下載文件示例

NSURLSessionDownLoadTask

使用downloadTaskWithURL方法來下載文件邑商,這個方法的閉包中會接受一個location參數(shù)摄咆,它表示下載好的文件的存放位置。

注意:downloadTaskWithURL會將文件保存在一個臨時目錄中奠骄,location指向這個臨時目錄的位置。如果要持久保存文件番刊,需將此文件從臨時目錄中移動出來含鳞。

(2)上傳文件示例.使用uploadTaskWithRequest方法

NSURLSessionUploadTask

#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

NSURLSession的代理對象結(jié)構(gòu)

--NSURLSessionDelegat作為所有代理的基類,定義了網(wǎng)絡請求最基礎(chǔ)的代理方法

--NSURLSessionTaskDelegate定義的網(wǎng)絡請求任務相關(guān)的代理方法

--NSURLSessionDownloadDelegate用于下載任務相關(guān)的代理方法闷沥,比如查看下載進度

--NSURLSesssionDataDelegate用于普通數(shù)據(jù)任務和上傳任務

#5 Demo

1.查詢歌曲

--聲明一個session常量和一個data task變量

SearchViewController.swift

--更新searchBarSearchButtonClicked(_:)方法

SearchViewController.swift

運行一下萎战,現(xiàn)在是這樣的!

simulator

2.下載歌曲

(1)新建一個文件狐赡,命名為Download撞鹉。

Download.swift

(2) 添加一個變量,來存儲urls和Download之間的映射關(guān)系颖侄。

SearchViewController.swift

(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方法。

SearchViewController.swift

--實現(xiàn)NSURLSessionDownloadDelegate方法.當下載完成時箕般,在控制臺輸出“Finished downloading”

SearchViewController.swift

--更新開始下載的方法.

SearchViewController.swift

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的歌曲傀广。

SearchViewController.swift

--更新delegate方法

SearchViewController.swift

運行一下痢虹,在console里,你可以看到destinationURL

destinationURL

在模擬器里主儡,點擊下載好的歌曲奖唯,便能進行播放啦!

simulator

4. 查看下載進度

--添加代理方法

SearchViewController.swift

--更新cell配置糜值。找到tableView(_:cellForRowAtIndexPath:)方法丰捷。

SearchViewController.swift

現(xiàn)在歌曲下載是這樣的:

simulator

5.暫停坯墨,繼續(xù),取消下載

--添加這三個方法病往。

暫停下載和取消下載的不同之處在于暫停下載還會產(chǎn)生resumeData捣染。

在繼續(xù)下載和暫停下載方法中,isDownLoading作為flag標記停巷,用來表示下載是否已經(jīng)開始耍攘。

SearchViewController.swift

--更新cell配置方法。cell有兩個button畔勤,一個button在“resume”和“pause”之間切換蕾各,另外一個button的title為“cancel”。

isDownloading作為flag庆揪,來判斷是否處在暫停狀態(tài)式曲。如果沒有處在暫停狀態(tài),”Pause“缸榛,否則吝羞,就”Resume“;
button只有在下載時才出現(xiàn)

運行一下内颗,現(xiàn)在是這樣的

simulator

完結(jié)钧排。

項目地址:github.com/Paganarchitect/iOS_tutorial_exercises_RayWenderlich.git

參考博客:NSURLSession Tutorial: Getting Started

NSURLSession 網(wǎng)絡庫 - 原生系統(tǒng)送給我們的禮物

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市均澳,隨后出現(xiàn)的幾起案子恨溜,更是在濱河造成了極大的恐慌,老刑警劉巖负懦,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件筒捺,死亡現(xiàn)場離奇詭異柏腻,居然都是意外死亡纸厉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門五嫂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來颗品,“玉大人,你說我怎么就攤上這事沃缘∏啵” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵槐臀,是天一觀的道長锄蹂。 經(jīng)常有香客問我,道長水慨,這世上最難降的妖魔是什么得糜? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任敬扛,我火速辦了婚禮,結(jié)果婚禮上朝抖,老公的妹妹穿的比我還像新娘啥箭。我一直安慰自己,他們只是感情好治宣,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布急侥。 她就那樣靜靜地躺著,像睡著了一般侮邀。 火紅的嫁衣襯著肌膚如雪坏怪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天豌拙,我揣著相機與錄音陕悬,去河邊找鬼。 笑死按傅,一個胖子當著我的面吹牛捉超,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播唯绍,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼拼岳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了况芒?” 一聲冷哼從身側(cè)響起惜纸,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绝骚,沒想到半個月后耐版,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡压汪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年粪牲,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片止剖。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡腺阳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出穿香,到底是詐尸還是另有隱情亭引,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布皮获,位于F島的核電站焙蚓,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜购公,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一赵哲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧君丁,春花似錦枫夺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至印蔗,卻和暖如春扒最,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背华嘹。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工吧趣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人耙厚。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓强挫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親薛躬。 傳聞我的和親對象是個殘疾皇子俯渤,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容