是什么?
- 網(wǎng)絡(luò)相關(guān)的操作是困難而復(fù)雜的鲜棠,Apple提供三個層面的API供我們處理網(wǎng)絡(luò),F(xiàn)oundation培慌、CFNetwork豁陆、POSIX,通常使用Foundation層面的API就足以滿足需求吵护。
網(wǎng)絡(luò)需求一般有如下幾種:
P2P網(wǎng)絡(luò)游戲盒音,P2P網(wǎng)絡(luò)通信,連接web服務(wù)器馅而,連接FTP服務(wù)器祥诽,發(fā)現(xiàn)和建議網(wǎng)絡(luò)服務(wù),解析DNS主機名用爪,socket或socket流原押,網(wǎng)絡(luò)通信安全問題。
在iOS開發(fā)中偎血,絕大部分的自定義網(wǎng)絡(luò)需求都是使用HTTP或HTTPS協(xié)議與web server的通信诸衔。
也就是說盯漂,我們必須要掌握的網(wǎng)絡(luò)內(nèi)容只是Foundation層的HTTP相關(guān)API的調(diào)用,包括怎么做HTTP和HTTPS請求以及播放網(wǎng)頁和多媒體內(nèi)容兩方面笨农。
怎么做?
- 通過NSURLSession或NSURLConnection發(fā)送網(wǎng)絡(luò)請求就缆,NSURLConnection在iOS9被廢棄。
NSURLSession組件
NSURLSession谒亦、NSURLRequest/NSMutableURLRequest竭宰、NSURLSessionConfiguration、NSURLSessionTask份招、NSURLCache
下面是各個組件的作用
NSURLSession
三種創(chuàng)建方法
1切揭、使用靜態(tài)的sharedSession方法,該類使用共享的會話锁摔,該會話使用全局的Cache廓旬,Cookie和證書。
2谐腰、通過sessionWithConfiguration:方法創(chuàng)建對象十气,也就是創(chuàng)建對應(yīng)配置的會話励背,與NSURLSessionConfiguration合作使用。
3叶眉、通過sessionWithConfiguration:delegate:delegateQueue方法創(chuàng)建對象,二三兩種方式可以創(chuàng)建一個新會話并定制其會話類型籍胯。該方式中指定了session的委托和委托所處的隊列竟闪。當不再需要連接時,可以調(diào)用Session的invalidateAndCancel直接關(guān)閉,或者調(diào)用finishTasksAndInvalidate等待當前Task結(jié)束后關(guān)閉。
NSURLSessionConfiguration:配置會話的屬性
常用配置
-
1绿聘、工作模式
默認會話模式(default):工作模式類似于原來的NSURLConnection,使用的是基于磁盤緩存的持久化策略挪圾,使用用戶keychain中保存的證書進行認證授權(quán)。 瞬時會話模式(ephemeral):該模式不使用磁盤保存任何數(shù)據(jù)。所有和會話相關(guān)的caches帝簇,證書丧肴,cookies等都被保存在RAM中芋浮,因此當程序使會話無效,這些緩存的數(shù)據(jù)就會被自動清空。 后臺會話模式(background):該模式在后臺完成上傳和下載凛驮,在創(chuàng)建Configuration對象的時候需要提供一個NSString類型的ID用于標識完成工作的后臺會話宏胯。
2、allowsCellularAccess 是否允許使用蜂窩網(wǎng)絡(luò)(移動手機流量)
3、timeoutIntervalForRequest timeoutIntervalForResource 設(shè)置超時時間
4先舷、最大連接數(shù)
5牲芋、cookie、caching等
NSURLRequest/NSMutableURLRequest
NSMutableURLRequest的常見設(shè)置內(nèi)容
- 設(shè)置請求方式(一般為GET和POST)
- 設(shè)置超時
- 設(shè)置請求頭(一般是token)
- 設(shè)置請求體(一般其他參數(shù))
- 設(shè)置緩存策略
NSURLSessionTask: 可支持的任務(wù)
NSURLSessionDataTask,
NSURLSessionUploadTask絮姆,
NSURLSessionDownloadTask以及iOS9的NSURLStreamTask蚁阳。
這四個類封裝了現(xiàn)代應(yīng)用程序的四個基本網(wǎng)絡(luò)任務(wù):獲取數(shù)據(jù)定血,比如JSON或XML诞外,以及上傳茫虽,下載文件和流媒體啥纸。
NSURLCache
- 獲得全局緩存對象(沒必要手動創(chuàng)建)
NSURLCache *cache = [NSURLCache sharedURLCache]; ```
- 設(shè)置內(nèi)存緩存的最大容量(字節(jié)為單位名船,默認為512KB)
-(void)setMemoryCapacity:(NSUInteger)memoryCapacity;```
- 設(shè)置硬盤緩存的最大容量(字節(jié)為單位迷扇,默認為10M)
- (void)setDiskCapacity:(NSUInteger)diskCapacity;```
- 硬盤緩存的位置:沙盒/Library/Caches
- 取得某個請求的緩存
(NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request; ```
清除某個請求的緩存
- (void)removeCachedResponseForRequest:(NSURLRequest *)request;```
- 清除所有的緩存
- (void)removeAllCachedResponses;```
相關(guān)委托方法
- 通過會話的委托,可以實現(xiàn)靈活復(fù)雜的網(wǎng)絡(luò)操作,下面是幾個常用的代理方法:
NSURLSessionDataDelegate
URLSession:dataTask:didReceiveData: 一收到數(shù)據(jù)時就會調(diào)用瞭亮,在一個任務(wù)中會調(diào)用很多次
URLSession:task:didCompleteWithError: 任務(wù)完成時調(diào)用
NSURLSessionDownloadDelegate
URLSession:downloadTask:didResumeAtOffset:expectedTotalBytes: 當任務(wù)暫停后繼續(xù)時調(diào)用
URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite: 通知下載進度
URLSession:downloadTask:didFinishDownloadingToURL: 下載完成后調(diào)用