也許你根本不需要Alamofire,何不嘗試下NSURLSession?

很多同學(xué)在遇到要使用網(wǎng)絡(luò)請求的時候跺撼,無腦Alamofire敛摘,不是說這個庫不好用。畢竟第三方习贫,畢竟還要學(xué)習(xí)他得使用方法逛球,還要引入他得代碼。為何不嘗試下使用NSURLSession苫昌,以前NSURLConnection操作起來有很多不便颤绕,大家可能都愿意使用第三方庫。但是現(xiàn)在的NSURLSession使用起來已經(jīng)很方便了祟身。我們何不利用學(xué)習(xí)Alamofire的時間來學(xué)習(xí)學(xué)習(xí)NSURLSession呢奥务?第三方庫也許有很多對json處理方便的加強(qiáng)功能,但是我們有時候只需要用他來做get , put ,post delete 請求 袜硫。還有一些下載上傳 氯葬、斷點下載等功能 其實NSURLSession已經(jīng)夠用了。

最簡單的調(diào)用

  if let url = NSURL(string: "https://httpbin.org/get") {
        
        NSURLSession.sharedSession().dataTaskWithURL(url){ data, response, error in
            
            //...
            
            }.resume()
        
    }

拿到一個 url 獲取默認(rèn)的session來處理url返回我們想要的數(shù)據(jù)

resume() 方法的調(diào)用婉陷,NSURLSession 默認(rèn)是不啟動的帚称,我們必須手工調(diào)用 resume() 方法,才會開始請求

NSURLSession 本身是不會進(jìn)行請求的秽澳,而是通過創(chuàng)建 task 的形式進(jìn)行網(wǎng)絡(luò)請求闯睹,同一個 NSURLSession 可以創(chuàng)建多個 task,并且這些 task 之間的 cache 和 cookie 是共享的担神。那么我們就來看看 NSURLSession 都能創(chuàng)建哪些 task 吧瞻坝。

  • NSURLSessionDataTask: 這個就是我們第一個例子中創(chuàng)建的 DataTask,它主要用于讀取服務(wù)端的簡單數(shù)據(jù),比如 JSON 數(shù)據(jù)杏瞻。其實這個請求不只是可以去數(shù)據(jù)所刀,修改,新增都是可以的捞挥,put , post

  • NSURLSessionDownloadTask: 這個 task 的主要用途是進(jìn)行文件下載浮创,它針對大文件的網(wǎng)絡(luò)請求做了更多的處理,比如下載進(jìn)度砌函,斷點續(xù)傳等等斩披。

  • NSURLSessionUploadTask: 和下載任務(wù)對應(yīng),這個 task 主要是用于對服務(wù)端發(fā)送文件類型的數(shù)據(jù)使用的讹俊。

圖片來源于網(wǎng)絡(luò)

那么NSURLSession只能通過NSURLSession.sharedSession()獲得嗎垦沉? -- NO,NSURLSession很強(qiáng)大 也是高度可配置的

NSURLSessionConfiguration

我們還可以通過NSURLSessionConfiguration來創(chuàng)建一個NSURLSession 仍劈。有三種配置類型可供我們選擇

  • defaultSessionConfiguration - 這個配置會使用全局的緩存厕倍,cookie 等信息,這個相當(dāng)于 NSURLSessionConfiguration 的默認(rèn)配置行為贩疙。
  • ephemeralSessionConfiguration - 這個配置不會對緩存或 cookie 以及認(rèn)證信息進(jìn)行存儲讹弯,相當(dāng)于一個私有的 Session况既,如果你開發(fā)一個瀏覽器產(chǎn)品,這個配置就相當(dāng)于瀏覽器的隱私模式组民。
  • backgroundSessionConfiguration - 這個配置可以讓你的網(wǎng)絡(luò)操作在你的應(yīng)用切換到后臺的時候還能繼續(xù)工作棒仍。

整個結(jié)構(gòu)大概就是這樣的

圖片來源于網(wǎng)絡(luò)

NSURLSessionConfiguration 還支持配置session的一些屬性,比如timeout 臭胜、cache添加http header等莫其,可以在這里 查閱所有可配置信息

那么我們來嘗試創(chuàng)建一個任務(wù)

 //定義一個默認(rèn)的session
  lazy var defaultSession = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
  //獲取data的task
  var dataTask:NSURLSessionDataTask?

  /**
     任務(wù)
     */
    func doTask(){
        guard let url = NSURL(string: "http://your.url") else { return }
        dataTask = defaultSession.dataTaskWithURL(url)
        dataTask?.resume()
    }

這個例子 跟上面的簡單例子如出一轍,不過時我們自己創(chuàng)建的session耸三,把步驟分開了榜配。

看看如何去配置呢

 func doTask2(){
        let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
        configuration.timeoutIntervalForRequest = 10 //超時時間
        configuration.requestCachePolicy = .UseProtocolCachePolicy //緩存策略
        configuration.HTTPAdditionalHeaders = ["Content-Type":"application/json"] //header 配置
        
        //更多配置詳見官方文檔...
        
        let defaultSession2 = NSURLSession(configuration:configuration)
        //獲取data的task
        var dataTask:NSURLSessionDataTask?
        
        guard let url = NSURL(string: "http://your.url") else { return }
        let request = NSMutableURLRequest(URL: url)
        request.HTTPMethod = "get" //post put delete 等
        //還有很多可以設(shè)置  更多設(shè)置 詳細(xì) command + 點擊 NSMutableURLRequest  就可以看到了
        
        dataTask = defaultSession2.dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in
            
            //操作數(shù)據(jù)
            
        })
        
        dataTask?.resume() //開啟任務(wù)
    }

我們可以對configuration和request進(jìn)行配置 來達(dá)到我們想要的目的

對請求的操作室基于task的 這里的task也是可以cancel的

那么下載呢?

lazy var downloadsSession:NSURLSession = {
        let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
        
        //delegateQueue設(shè)置為nil session會自己創(chuàng)建一個串行的隊列
        return NSURLSession(configuration: configuration, delegate: self, delegateQueue: nil)
    }()

下載創(chuàng)建session和普通的請求差不多吕晌,我們這里添加了代理就可以拿到下載進(jìn)度

   func doDownload(){
        guard let url = NSURL(string: "http://your.download.url") else { return }
        let downloadTask = downloadsSession.downloadTaskWithURL(url)
        downloadTask.resume()
    }

完成回調(diào)可以用閉包 也可以代理蛋褥。但是要拿到下載進(jìn)度 必須用代理了

 class yourClass:NSURLSessionDownloadDelegate{
    func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL) {
        
        print("下載完成")
        if let originalURL = downloadTask.originalRequest?.URL?.absoluteString,destinationURL = localFilePathForUrl(originalURL){
            print("本地的臨時地址 : \(destinationURL)")
            
            let fileManager = NSFileManager.defaultManager()
            
            do {
                try fileManager.removeItemAtURL(destinationURL)

            } catch let error as NSError {
                print("Error: \(error.localizedDescription)")
            }
            
            do {
                try fileManager.copyItemAtURL(location, toURL: destinationURL)
            } catch let error as NSError {
                print("Error: \(error.localizedDescription)")
            }
            
        }
    }
    

    /**
     監(jiān)控下載進(jìn)度
     */
    func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) {
    
        if let downloadUrl = downloadTask.originalRequest?.URL?.absoluteString,download = activeDownloads[downloadUrl]{
            
            download.progress =  Float(totalBytesWritten)/Float(totalBytesExpectedToWrite)
            let totalSize = NSByteCountFormatter.stringFromByteCount(totalBytesExpectedToWrite, countStyle: NSByteCountFormatterCountStyle.Binary)
            if let trackIndex = trackIndexForDownloadTask(downloadTask),trackCell = tableView.cellForRowAtIndexPath(NSIndexPath(forRow: trackIndex, inSection: 0)) as? TrackCell{
            

            }
    
    }
}

當(dāng)然下載過程中也是可以取消的 直接調(diào)用task.cancel()

如果需要暫停

task.cancelByProducingResumeData { data in
                    if data != nil {
                          //將data保存本地 或者 內(nèi)存 
                    }
                }

繼續(xù)下載

//resumeData 為上次保存的data
task = downloadsSession.downloadTaskWithResumeData(resumeData)

task.resume()

上傳參照下載。睛驳。

本文參照 以及推薦擴(kuò)展閱讀http://www.raywenderlich.com/110458/nsurlsession-tutorial-getting-started

http://swiftcafe.io/2015/12/20/nsurlsession/

http://swiftcafe.io/2015/12/23/nsurlsession-app/

http://www.reibang.com/p/fb5aaeac06ef
建議大家去讀下raywenderlich的這片文章 講的很細(xì)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末烙心,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子乏沸,更是在濱河造成了極大的恐慌淫茵,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蹬跃,死亡現(xiàn)場離奇詭異匙瘪,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蝶缀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門丹喻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人翁都,你說我怎么就攤上這事碍论。” “怎么了柄慰?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵鳍悠,是天一觀的道長。 經(jīng)常有香客問我坐搔,道長藏研,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任概行,我火速辦了婚禮蠢挡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己袒哥,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布消略。 她就那樣靜靜地躺著堡称,像睡著了一般。 火紅的嫁衣襯著肌膚如雪艺演。 梳的紋絲不亂的頭發(fā)上却紧,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機(jī)與錄音胎撤,去河邊找鬼晓殊。 笑死,一個胖子當(dāng)著我的面吹牛伤提,可吹牛的內(nèi)容都是我干的巫俺。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼肿男,長吁一口氣:“原來是場噩夢啊……” “哼介汹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起舶沛,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤嘹承,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后如庭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叹卷,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年坪它,在試婚紗的時候發(fā)現(xiàn)自己被綠了骤竹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡往毡,死狀恐怖瘤载,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情卖擅,我是刑警寧澤鸣奔,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站惩阶,受9級特大地震影響挎狸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜断楷,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一锨匆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦恐锣、人聲如沸茅主。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诀姚。三九已至,卻和暖如春玷禽,著一層夾襖步出監(jiān)牢的瞬間赫段,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工矢赁, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留糯笙,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓撩银,卻偏偏與公主長得像给涕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子额获,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

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

  • NSURLSession概述1. NSURLSession session類型NSURLSession包括下面3種...
    瞎嘚嘚閱讀 1,873評論 2 2
  • 在蘋果徹底棄用NSURLConnection之后自己總結(jié)的一個網(wǎng)上的內(nèi)容稠炬,加上自己寫的小Demo,很多都是借鑒網(wǎng)絡(luò)...
    付寒宇閱讀 4,268評論 2 13
  • URLSession NSURLSession是iOS7中新的網(wǎng)絡(luò)接口咪啡,與NSURLConnection是并列的首启。...
    JonesCxy閱讀 1,555評論 0 9
  • 產(chǎn)品詳情: 水分不流失 只為保濕 快速補水形成保濕保護(hù)膜 補充營養(yǎng) 緊致肌膚 增加彈性 清爽控油 肌膚無負(fù)擔(dān)
    SHEN_075閱讀 351評論 0 0
  • 喂毅桃,你幸福嗎?嗨准夷,我很幸福钥飞! 喂,你有煩惱嗎衫嵌?嗯读宙,有吧,恩楔绞,沒有结闸,唉,我也不知道耶酒朵。 當(dāng)有人問你是否幸福時桦锄,很多人...
    冬少爺閱讀 402評論 9 19