AFN基本使用
簡介
- 框架結構
- NSURLSession
- NSURLSessionManager對NSURLSession的封裝
- AFHTTPSessionManager會話管理者
- 序列化處理Serialization
- AFURLRequestSerilization請求
- AFURLResponseSerilization響應
- 擴展功能
- AFSecurityPolicy安全
- AFNetworkReachabilityManager監(jiān)聽
- UIKit+AFNetworking
- 下載緩存圖片UIImageView+AFNetworking
- 思考:這個和SDWebImage有什么區(qū)別呢乘凸?
- 很多好用的分類
- 下載緩存圖片UIImageView+AFNetworking
- NSURLSession
GET請求
- 創(chuàng)建會話管理者
- [AFHTTPSessionManager manager]
- 創(chuàng)建字典保存參數(shù)
- 發(fā)送請求
- [manager GET:parameters:progress:{}success:{}failure:^{}]
- 參數(shù)一:請求路徑不包含參數(shù),類型是NSString
- 參數(shù)二:參數(shù)瑞你,用字典保存參數(shù)
- 參數(shù)三:進度回調(diào)憎夷,發(fā)送GET請求不需要進度信息,nil
- 參數(shù)四:網(wǎng)絡請求成功之后的回調(diào)
- dataTask:請求任務本身
- task.response是響應頭
- responseObject:不是響應頭锨亏,是響應體,內(nèi)部已經(jīng)完成了反序列化處理 (已經(jīng)把JSON轉(zhuǎn)為了OC對象了)
- dataTask:請求任務本身
- 參數(shù)五:網(wǎng)絡請求失敗之后的回調(diào)
- task:請求任務
- error:錯誤信息
- [manager GET:parameters:progress:{}success:{}failure:^{}]
POST請求
- 創(chuàng)建會話管理者
- [AFHTTPSessionManager manager]
- 創(chuàng)建字典保存參數(shù)
- 發(fā)送請求
- [manager POST:parameters:progress:{}success:{}failure:^{}]
- 參數(shù)一:請求路徑不包含參數(shù),類型是NSString
- 參數(shù)二:參數(shù)廓握,用字典保存參數(shù)
- 參數(shù)三:進度回調(diào)伴鳖,發(fā)送GET請求不需要進度信息,nil
- 參數(shù)四:網(wǎng)絡請求成功之后的回調(diào)
- dataTask:請求任務本身
- task.response是響應頭
- responseObject:不是響應頭锯梁,是響應體即碗,內(nèi)部已經(jīng)完成了反序列化處理 (已經(jīng)把JSON轉(zhuǎn)為了OC對象了)
- dataTask:請求任務本身
- 參數(shù)五:網(wǎng)絡請求失敗之后的回調(diào)
- task:請求任務
- error:錯誤信息
- [manager POST:parameters:progress:{}success:{}failure:^{}]
使用AFN實現(xiàn)文件下載
-
創(chuàng)建會話管理者
- [AFHTTPSessionManager manager]
確定請求路徑
創(chuàng)建請求對象
-
下載
- [manager downloadTaskWithRequest:progress:destination:completionHandler:
- 參數(shù)一:請求對象
- 參數(shù)二:進度回調(diào)
- NSProgress
- 計算進度
- downloadProgress.completedUnitCount/downloadProgress.totalUnitCount;
- 參數(shù)三:destination做URL處理的回調(diào),告訴下載完之后文件寫到哪里 ,內(nèi)部自動做了剪切處理
- targetPath:文件下載到沙盒中的臨時路徑
- response響應頭信息
- 返回值:告訴AFN文件應該剪切到什么地方
- 怎么把路徑轉(zhuǎn)為URL?
- [NSURL fileURLWithString:]
- 參數(shù)四:完成之后的回調(diào)
- filePath:就是文件最終保存的位置
- [manager downloadTaskWithRequest:progress:destination:completionHandler:
-
執(zhí)行任務
- [downloadTask resume];
-
優(yōu)點:
- 通過block塊集成了下載進度
- 內(nèi)部完成了文件剪切處理
使用AFN實現(xiàn)文件上傳
- 不用拼接了
- 創(chuàng)建會話管理者
- 發(fā)送POST請求上傳文件
- [manager POST:parameters:constructingBodyWithBlock:progress:success:failure:]
- 參數(shù)一:請求路徑
- 參數(shù)二:非文件參數(shù)陌凳,用字典來傳
- 參數(shù)三:block塊剥懒,處理要上傳的文件的
- fromData:遵守AFMultipartFormData協(xié)議
- append有些方法不能用
- 方式一:appendPartWithFileData:name:fileName:mimeType:
- 參一:要上傳的文件數(shù)據(jù)
- 參二:由后臺接口規(guī)定的file
- 參三:文件上傳到服務器之后,以什么名稱保存
- 參四:文件的二進制數(shù)據(jù)類型(四種方法獲得)image/png
- 方式二:appendPartWithFileURL:name:filename:mimeType:error:
- 參一:fileURLWithPath:
- 參二:file
- 參三:文件上傳到服務器以什么名稱保存
- 參四:文件的二進制數(shù)據(jù)
- 方式三:appendPartWithFileURL:name:error:
- 內(nèi)部實現(xiàn)
- 文件名稱是拿到文件路徑的最后一個節(jié)點
- C語言方法獲得mimeType的方法獲得mimeType
- 內(nèi)部實現(xiàn)
- fromData:遵守AFMultipartFormData協(xié)議
- 參數(shù)四:進度回調(diào)
- 進度:當前已經(jīng)完成的/總大小
- 參數(shù)五:成功之后的回調(diào)
- responseObject:響應體合敦,內(nèi)部把JSON數(shù)據(jù)轉(zhuǎn)為了OC對象
- 參數(shù)六:失敗之后的回調(diào)
AFN使用技巧
- 封裝網(wǎng)絡請求工具類
- 工具類依賴AFN
- 控制器里面發(fā)送網(wǎng)絡請求的代碼用工具類來實現(xiàn)
- 封裝思想
AFN序列化處理
-
創(chuàng)建會話管理者
- [AFHTTPSessionManager manager]
創(chuàng)建字典保存參數(shù)
-
發(fā)送請求
- [manager GET:parameters:progress:{}success:{}failure:^{}]
-
問題一:如果服務器返回的不是JSON數(shù)據(jù)初橘,而是XML數(shù)據(jù)怎么處理?
- 該請求服務器返回的是XML數(shù)據(jù)充岛,而AFN默認以JSON的方式來處理XML數(shù)據(jù)
- 解決:
- 如果返回的數(shù)據(jù)是xml保檐,那么應該修改對響應的處理方式為XML
- manager.responserSerilizer = [AFXMLEParserResponseSerializer serializer]
- 創(chuàng)建XML解析器
- (NSXMLParser *)responseObject;
- 設置代理:parser.delegate = self
- 開始解析[parser parse]
- 創(chuàng)建XML解析器
- 遵守協(xié)議/實現(xiàn)代理方法didStartElement:
-
問題二:如果服務器返回的既不是JSON也不是XML怎么辦?比如對圖片發(fā)請求(二進制數(shù)據(jù))
- 默認以JSON方式處理
- 請求失敗崔梗,怎么解決
- 如果服務器返回的數(shù)據(jù)既不是JSON也不是XML夜只,那么就設置為HTTP的解析方式
- manager.responserSerilizer = [AFHTTPResponseSerializer serializer]
- imageWithData:
-
問題三:如果請求的不是圖片,而是網(wǎng)頁怎么辦蒜魄?
- 比如對百度發(fā)請求
- 既不是JSON也不是XML使用 AFHTTPResponseSerializer
-
問題四:以JSON的方式傳參數(shù)
- 之前的處理方式:字典
- manager.requestSerializer = [AFJSONRequestSerializer serializer]
NSURLSession和NSURLConnection對比
- NSURLSession支持http2.0協(xié)議 ios9.0之后
- NSURLSession在處理下載任務的時候扔亥,可以直接把數(shù)據(jù)下載到沙盒里面
- NSURLSession支持后臺下載|上傳
- 同一個NSURLSession發(fā)送多個請求,只需要建立一次連接(復用TCP)
- NSURLSession提供了全局的session并且可以統(tǒng)一配置谈为,使用更加方便
- NSURLSession下載的時候是多線程異步處理的旅挤,效率更高
總結
- 文件下載
- NSURLSessionDataTask - 離線斷點下載(斷點續(xù)傳)
- NSURLSessionDownloadTask -- 缺點:無法離線斷點下載
- 文件上傳
- AFN基本使用
- GET|POST
- 下載|上傳
- 工具類|序列化
- NSURLSession|NSURLConnection對比
AFN監(jiān)測網(wǎng)絡狀態(tài)改變
- 網(wǎng)絡狀態(tài)改變
- 3G/Wifi的切換
- AFNetworkReachabilityManager
- 創(chuàng)建一個網(wǎng)絡狀態(tài)監(jiān)聽管理者
- AFNetworkReachabilityManager sharedManager
- 監(jiān)聽狀態(tài)改變
-
[manager setReachabilityStatusChangeBlock:^{}]
- status:
- Unkown:網(wǎng)絡狀態(tài)未知
- NotReachable:沒有網(wǎng)絡
- ViaWWAN:蜂窩網(wǎng)絡
- ViaWiFi :wifi
- status:
-
開啟網(wǎng)絡狀態(tài)監(jiān)聽者
- startMonitoring真機演示
- iTools
- 以前可以通過iTools拿到應用,對應用做一些操作峦阁,現(xiàn)在要拿到應用的數(shù)據(jù)要花錢谦铃,拿不到應用的包
- 我的iphone應用
- finder中顯示 .ipa
- 歸檔實用工具打開,可以拿到圖片數(shù)據(jù)榔昔,顯示包內(nèi)容
- 開發(fā)中驹闰,需要提測,提測的時候測試部門一般會提供一些測試機撒会,提測的時候嘹朗,怎么把項目運行到測試機上呢?
- 提測的時候會要求存檔诵肛,打包成ipa包屹培,用iTools安裝
-