代碼示例:https://github.com/johnlui/Swift-On-iOS/blob/master/BuildYourHTTPRequestLibrary
開源項目:Pitaya,適合大文件上傳的 HTTP 請求庫:https://github.com/johnlui/Pitaya
本系列文章中,我們將嘗試使用 NSURLSession 技術構建一個自己的網絡請求庫。
NSURLSession 簡介
NSURLSession 是 iOS7 引入的新網絡請求接口,在 WWDC2013 中有詳細介紹,下面是描述其結構的一頁 slides:
當應用在前台時,NSURLSession 跟 NSURLConnection 沒有什麼區別,但是在程序切換到後台之後 Background Session 就會更加靈活。
嘗試 NSURLSession
准備工作
新建一個名為 BuildYourHTTPRequestLibrary 的單頁面應用,在頁面上居中放置一個按鈕,名為 Request:
拖動綁定 Touch Up Inside 事件:
使用 NSURLSession
在 mainButtonBeTapped 函數內填充以下代碼:
@IBAction func mainButtonBeTapped(sender: AnyObject) { let session = NSURLSession.sharedSession() let request = NSURLRequest(URL: NSURL(string: "http://baidu.com")!) let task = session.dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in let string = NSString(data: data, encoding: NSUTF8StringEncoding) println(string) }) task.resume() }
運行項目,點擊按鈕,查看結果:
使用成功!
感受異步
異步
改寫 mainButtonBeTapped 函數的代碼:
@IBAction func mainButtonBeTapped(sender: AnyObject) { let session = NSURLSession.sharedSession() let request = NSURLRequest(URL: NSURL(string: "http://baidu.com")!) let task = session.dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in println("just wait for 5 seconds!") sleep(5) let string = NSString(data: data, encoding: NSUTF8StringEncoding) println(string) }) task.resume() }
再次嘗試,兩次打印之間間隔了五秒,主線程未阻塞,證明 NSURLSession 為異步執行。
阻塞
嘗試多次點擊,我們能夠看到每五秒執行一次,直到全部執行完畢。
NSURLSession 采用的是 “異步阻塞” 模型,即所有請求在發出後都進入 2# 線程執行,在 2# 線程內部按照阻塞隊列模式執行。
下一步:自己動手寫一個 iOS 網絡請求庫(二)——封裝接口
下一步:自己動手寫一個 iOS 網絡請求庫(三)——降低耦合