標籤:
AFNetworking是日常開發中最常用的網路架構,現在我們使用的版本是3.0版,3.0與2.0版最大的區別就是,AFNetworking 2.0使用NSURLConnection的基礎API ,而3.0是完全基於NSURLSession的API,已經拋棄了NSURLConnection。而NSURLSession可以看作是是NSURLConnection 的替代者,在2013年蘋果全球開發人員大會(WWDC2013)隨ios7一起發布,是對NSURLConnection進行了重構最佳化後的新的網路提供者。從iOS9.0開始, NSURLConnection中發送請求的兩個方法已到期(同步請求,非同步請求),蘋果官方不再推薦使用。下面就將NSURLConnection與NSURLSession的區別進行簡單的對比。
1. 普通任務和上傳
NSURLSession針對下載/上傳等複雜的網路操作提供了專門的解決方案,針對普通、上傳和下載分別對應三種不同的網路請求任務:NSURLSessionDataTask, NSURLSessionUploadTask和NSURLSessionDownloadTask.。建立的task都是掛起狀態,需要resume才能執行。
當伺服器返回的資料較小時,NSURLSession與NSURLConnection執行普通任務的操作步驟沒有區別。
執行上傳任務時,NSURLSession與NSURLConnection一樣同樣需要設定POST請求的請求體進行上傳。
2.下載任務方式
NSURLConnection下載檔案時,先將整個檔案下載到記憶體,然後再寫入沙箱,如果檔案比較大,就會出現記憶體暴漲的情況。而使用NSURLSessionUploadTask下載檔案,會預設下載到沙箱中的tem檔案夾中,不會出現記憶體暴漲的情況,但在下載完成後會將tem中的臨時檔案刪除,需要在初始化任務方法時,在completionHandler回調中增加儲存檔案的代碼。
以下代碼是執行個體化網路下載任務時將下載的檔案儲存到沙箱的caches檔案夾中:
[NSURLSessionDownloadTask [NSURLSessionDownloadTask *task = [session downloadTaskWithURL:[NSURL URLWithString:@"http://127.0.0.1/dawenjian.zip"] completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//擷取沙箱的caches路徑
NSString *path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)lastObject]stringByAppendingPathComponent:@"kkk.dmg"];
//產生URL路徑
NSURL *DCurl = [NSURL fileURLWithPath:path];
//將檔案儲存到指定檔案目錄下
[[NSFileManager defaultManager]moveItemAtURL:location toURL:DCurl error:nil]; }]resume];
3.要求方法的控制
NSURLConnection執行個體化對象,執行個體化開始,預設請求就發送(同步發送),不需要調用start方法。而cancel 可以停止請求的發送,停止後不能繼續訪問,需要建立新的請求。
NSURLSession有三個控制方法,取消(cancel),暫停(suspend),繼續(resume),暫停後可以通過繼續恢複當前的請求任務。
4.斷點續傳的方式
NSURLConnection進行斷點下載,通過設定訪問請求的HTTPHeaderField的Range屬性,開啟運行迴圈,NSURLConnection的代理方法作為運行迴圈的事件來源,接收到下載資料時代理方法就會持續調用,並使用NSOutputStream管道流進行資料儲存。
NSURLSession進行斷點下載,當暫停下載任務後,如果 downloadTask (下載任務)為非空,調用 cancelByProducingResumeData:(void (^)(NSData *resumeData))completionHandler 這個方法,這個方法接收一個參數,完成處理代碼塊,這個代碼塊有一個 NSData 參數 resumeData,如果 resumeData 非空,我們就儲存這個對象到視圖控制器的 resumeData 屬性中。在點擊再次下載時,通過調用 [ [self.session downloadTaskWithResumeData:self.resumeData]resume]方法進行繼續下載操作。
經過以上比較可以發現,使用NSURLSession進行斷點下載更加便捷。
5.配置資訊
NSURLSession的構造方法(sessionWithConfiguration:delegate:delegateQueue)中有一個 NSURLSessionConfiguration類的參數可以設定配置資訊,其決定了cookie,安全和快取策略,最大主機串連數,資源管理,網路逾時等配置。NSURLConnection不能進行這個配置,相比於 NSURLConnection 依賴於一個全域的設定物件,缺乏靈活性而言,NSURLSession 有很大的改進了。
NSURLSession可以設定三種配置資訊,分別通過調用三個累方法返回設定物件:
+ (NSURLSessionConfiguration *)defaultSessionConfiguration,配置資訊使用基於硬碟的持久話Cache,儲存使用者的認證到鑰匙串,使用共用cookie儲存;
+ (NSURLSessionConfiguration *)ephemeralSessionConfiguration ,配置資訊和default大致相同。除了,不會把cache,認證,或者任何和Session相關的資料存放區到硬碟,而是儲存在記憶體中,生命週期和Session一致。比如瀏覽器無痕瀏覽等功能就可以基於這個來做;
+ (NSURLSessionConfiguration *)backgroundSessionConfigurationWithIdentifier:(NSString *)identifier,配置資訊可以建立一個可以在後台甚至APP已經關閉的時候仍然在傳輸資料的session。注意,後台Session一定要在建立的時候賦予一個唯一的identifier,這樣在APP下次啟動並執行時候,能夠根據identifier來進行相關的區分。如果使用者關閉了APP,IOS 系統會關閉所有的background Session。而且,被使用者強制關閉了以後,IOS系統不會主動喚醒APP,只有使用者下次啟動了APP,資料轉送才會繼續。
由於個人水平有限,本篇文章的整理參考部分資料,以下是相關資料的引用地址:
1.http://blog.csdn.net/djl4104804/article/details/22667273
2.http://demo.netfoucs.com/hello_hwc/article/details/44513699#
3.http://www.th7.cn/Program/IOS/201402/173926.shtml
ios網路提供者-NSURLSession與NSURLConnection的區別