NFNetWorking的整理: ????????????????????????????????????????????????????????????????????????????????????????? AFNetworking是一個非常方便的網(wǎng)絡(luò)請求庫,可以輕松實現(xiàn)各種網(wǎng)絡(luò)請求,比如經(jīng)常使用的GET請求、POST請求,以及上傳多張圖片等,下面介紹一下基本的使用方法。
首先下載AFNetworking 然后在需要使用的類中,導(dǎo)入如下2個頭文件:

ASIHttpRequest,有三年多沒更新,而且還是MRC,跟不上技術(shù)的發(fā)展了,在ARC基礎(chǔ)上全部都是使用AFNetWorking:ARC下的一個網(wǎng)絡(luò)請求庫,還在不斷的更新,使用簡單方便
發(fā)請求:全部都是異步請求,沒有同步請求的方法。使用manager可以發(fā)起GET/PUT/PATCH...請求.
(1.)創(chuàng)建網(wǎng)絡(luò)請求管理類? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];? ? ? ? ? ? ? ? ? ? ? ? ? AFNetworking:默認(rèn)只支持三種響應(yīng)頭:application/json? text/json? text/javascrip? ? ? ? ? ? 我們常用的還有一種:text/html 如果服務(wù)器需要該類型,則設(shè)置下面的參數(shù)? ? ? ? ? ? ? ? ? ? ? ? ? ? (請求失?。涸趀rror中出現(xiàn)類似 text/html 這種類型的參數(shù)是再設(shè)置).? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (2.)請求體? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];??????????????????????????????????????????????????????????????????????????????????????? (3.)get請求 ?????????????????????????? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? [manager GET:@"http://localhost:8080/Login/NewServlet?command=5"???????? parameters:nil?????? progress:^(NSProgress * _Nonnull downloadProgress) {???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? } success:^(NSURLSessionDataTask * _Nonnull task, id? _Nullable responseObject) {????????????????????????????????????????? //處理請求成功的事件????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? //AFNetworking:返回參數(shù)是json,AFNetworking會自動返回json解析后的數(shù)據(jù)(NSArray 、 NSDictionary)?????????? //不需要我們使用NSJSONSerialization解析json數(shù)據(jù)??????????????????????????????????????????????????????????????????????????????????????????????? if ([responseObject isKindOfClass:[NSData class]]) {?????????????????????????????????????????????????????? NSLog(@"data--------->%@", [[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding]); }else if ([responseObject isKindOfClass:[NSDictionary class]]) {
NSLog(@"responseObject -----> %@", responseObject);??????????????????????????????????????????????????????????????????????????????????? }???????
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {????????????????????????????????????????????????? //處理請求失敗的事件?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? NSLog(@"error -----> %@", error);????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? }];
請求數(shù)據(jù)格式???????????????????????????????????????????????????????????????????????????????????????????????????????????????????? AFHTTPRequestSerializer?????二進(jìn)制格式???????????????????????????????????????????????????????????????????? AFJSONRequestSerializer?????JSON??????????????????????????????????????????????????????????????? AFPropertyListRequestSerializer????PList(是一種特殊的XML,解析起來相對容易)?????????????????????????????????????????????????????? 響應(yīng)數(shù)據(jù)格式??????????????????????????????????????????????????????????????????????????????????????????????????????????????????? AFHTTPResponseSerializer?? 二進(jìn)制格式???????????????????????????????????????????????????????????????????? AFJSONResponseSerializer???JSON???????????????????????????????????????????????????????????????? AFXMLParserResponseSerializer?????XML,只能返回XMLParser,還需要自己通過代理方法解析??? AFXMLDocumentResponseSerializer?(Mac?OS?X)???????????????????????????????????????????? AFPropertyListResponseSerializer???PList?????????????????????????????????????????????????????? AFImageResponseSerializer??????????Image???????????????????????????????????????????????????????? AFCompoundResponseSerializer????? 組合
??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 請求數(shù)據(jù)格式??????????????????????????????????????????????????????????????????????????????????????????????????????????????? AFHTTPRequestSerializer?????二進(jìn)制格式??????????????????????????????????????????????????????????????????? AFJSONRequestSerializer?????JSON????????????????????????????????????????????????????????????????????? AFPropertyListRequestSerializer????PList(是一種特殊的XML,解析起來相對容易)
響應(yīng)數(shù)據(jù)格式?????????????????????????????????????????????????????????????????????????????????????????????????????????????????? AFHTTPResponseSerializer?? 二進(jìn)制格式?????????????????????????????????????????????????????????????????? AFJSONResponseSerializer???JSON?????????????????????????????????????????????????????????????????? AFXMLParserResponseSerializer?????XML,只能返回XMLParser,還需要自己通過代理方法解析?????????? AFXMLDocumentResponseSerializer?(Mac?OS?X)?????????????????????????????????????????? AFPropertyListResponseSerializer???PList???????????????????????????????????????????????????????????????? AFImageResponseSerializer??????? Image?????????????????????????????????????????????????????????????????????????????????????? AFCompoundResponseSerializer? ? ? 組合請求數(shù)據(jù)格式????????????????????????????????????????????????? AFHTTPRequestSerializer?????二進(jìn)制格式???????????????????????????????????????????????????????????????????? AFJSONRequestSerializer?????JSON?????????????????????????????????????????????????????????????? AFPropertyListRequestSerializer????PList(是一種特殊的XML,解析起來相對容易)
響應(yīng)數(shù)據(jù)格式????????????????????????????????????????????????????????????????????????????????????????????????????????????????? AFHTTPResponseSerializer?? 二進(jìn)制格式?????????????????????????????????????????????????????????????????? AFJSONResponseSerializer???JSON??????????????????????????????????????????????????????????????????? AFXMLParserResponseSerializer?????XML,只能返回XMLParser,還需要自己通過代理方法解析?? AFXMLDocumentResponseSerializer?(Mac?OS?X)??????????????????????????????????????????? AFPropertyListResponseSerializer???PList????????????????????????????????????????????????????? AFImageResponseSerializer??????????Image??????????????????????????????????????????????????????? AFCompoundResponseSerializer???????組合
(4.)POST請求???????????????????????????????????????????????????????????????????????????????? manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];?????????????????? [manager POST:@"http://localhost:8080/Login/NewServlet" parameters:parma progress:^(NSProgress * _Nonnull uploadProgress) {????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? } success:^(NSURLSessionDataTask * _Nonnull task, id? _Nullable responseObject) {
NSLog(@"------->%@", responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"error ------> %@", error);
}];
(5.)稍微插入一點小知識???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? //檢測網(wǎng)絡(luò)狀態(tài)?????????????????????????????????????????????????????????????????????????????????????????????????????????????? [manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {????????? if (status == 0) {?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? NSLog(@"沒有網(wǎng)絡(luò)");?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? }else if (status == 1) {?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? NSLog(@"移動網(wǎng)絡(luò)");???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? }else if (status == 2) {?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? NSLog(@"WiFi");???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? }??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? }];
//開始檢測??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? [manager.reachabilityManager startMonitoring];
SDWebImage的使用? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 第一步,下載SDWebImage,導(dǎo)入工程。???????????????????????????????????????????????????????????????????????? github托管地址https://github.com/rs/SDWebImage????????????????????????????????????????????????????????? 第二步,在需要的地方導(dǎo)入頭文件? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #import "UIImageView+WebCache.h"????????????????????????????????????????????????????????????????????????????????

然后再說說加載圖片的一些流程? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1.入口setImageWithURL:placeholderImage:options: 會先把 placeholderImage 顯示,然后 SDWebImageManager 根據(jù) URL 開始處理圖片。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2.進(jìn)入SDWebImageManager-downloadWithURL:delegate:options:userInfo:,交給SDImageCache 從緩存查找圖片是否已經(jīng)下載 queryDiskCacheForKey:delegate:userInfo:.? ? 3.先從內(nèi)存圖片緩存查找是否有圖片,如果內(nèi)存中已經(jīng)有圖片緩存,SDImageCacheDelegate 回調(diào) imageCache:didFindImage:forKey:userInfo: 到 SDWebImageManager。? ? ? ? ? ? ? ? ? ???? 4.如果內(nèi)存緩存中沒有,生成 NSInvocationOperation 添加到隊列開始從硬盤查找圖片是否已經(jīng)緩存。? ? ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 5.根據(jù) URLKey 在硬盤緩存目錄下嘗試讀取圖片文件。這一步是在 NSOperation 進(jìn)行的操作,所以回主線程進(jìn)行結(jié)果回調(diào)notifyDelegate:。????????????????????????????????????????????????????????????????????????? 6.如果上一操作從硬盤讀取到了圖片,將圖片添加到內(nèi)存緩存中(如果空閑內(nèi)存過小,會先清空內(nèi)存緩存)。SDImageCacheDelegate 回調(diào)imageCache:didFindImage:forKey:userInfo:。進(jìn)而回調(diào)展示圖片。???????????????????????????????????????????????????????????????????????????????????????????????????????????????? 7.如果從硬盤緩存目錄讀取不到圖片,說明所有緩存都不存在該圖片,需要下載圖片,回調(diào)imageCache:didNotFindImageForKey:userInfo:。???????????????????????????????????????????????????????????? 8.共享或重新生成一個下載器SDWebImageDownloader?開始下載圖片。?????????????????????????????????? 9.圖片下載由 NSURLConnection 來做,實現(xiàn)相關(guān) delegate 來判斷圖片下載中、下載完成和下載失敗。????????????????????????????????????????????????????????????????????????????????????? 10.connection:didReceiveData:中利用 ImageIO 做了按圖片下載進(jìn)度加載效果。11.connectionDidFinishLoading:數(shù)據(jù)下載完成后交給?SDWebImageDecoder做圖片解碼處理。?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 12.圖片解碼處理在一個 NSOperationQueue 完成,不會拖慢主線程 UI。如果有需要對下載的圖片進(jìn)行二次處理,最好也在這里完成,效率會好很多。?????????????????????????????????????????????????????????? 13.在主線程?notifyDelegateOnMainThreadWithInfo:宣告解碼完成,imageDecoder:didFinishDecodingImage:userInfo:回調(diào)給SDWebImageDownloader.???? 14.imageDownloader:didFinishWithImage:回調(diào)給 SDWebImageManager 告知圖片下載完成。?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 15.通知所有的 downloadDelegates 下載完成,回調(diào)給需要的地方展示圖片。?????????????????????? 16.將圖片保存到 SDImageCache 中,內(nèi)存緩存和硬盤緩存同時保存。寫文件到硬盤也在以單獨 NSInvocationOperation 完成,避免拖慢主線程。???????????????????????????????????????????????? 17.SDImageCache 在初始化的時候會注冊一些消息通知,在內(nèi)存警告或退到后臺的時候清理內(nèi)存圖片緩存,應(yīng)用結(jié)束的時候清理過期圖片。????????????????????????????????????????????????????????????????????? 18.SDWI 也提供了?UIButton+WebCache和?MKAnnotationView+WebCache,方便使用。19.SDWebImagePrefetcher可以預(yù)先下載圖片,方便后續(xù)使用????????????????????????????????????????????????

SDWebImage庫的作用還是要拿出來講一下? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 通過對UIImageView的類別擴(kuò)展來實現(xiàn)異步加載替換圖片的工作。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 主要用到的對象:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1、UIImageView (WebCache)類別,入口封裝,實現(xiàn)讀取圖片完成后的回調(diào)? ? ? ? ? ? ? ? ? ? ? ? ? ? 2、SDWebImageManager,對圖片進(jìn)行管理的中轉(zhuǎn)站,記錄那些圖片正在讀取。向下層讀取Cache(調(diào)用SDImageCache),或者向網(wǎng)絡(luò)讀取對象(調(diào)用SDWebImageDownloader) 。實現(xiàn)SDImageCache和SDWebImageDownloader的回調(diào)。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 3、SDImageCache,根據(jù)URL的MD5摘要對圖片進(jìn)行存儲和讀?。▽崿F(xiàn)存在內(nèi)存中或者存在硬盤上兩種實現(xiàn))實現(xiàn)圖片和內(nèi)存清理工作。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 4、SDWebImageDownloader,根據(jù)URL向網(wǎng)絡(luò)讀取數(shù)據(jù)(實現(xiàn)部分讀取和全部讀取后再通知回調(diào)兩種方式)????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? SDWebImage的用法還有很多,需要在日后的編程中去發(fā)現(xiàn)