NFNetWorking的整理: ????????????????????????????????????????????????????????????????????????????????????????? AFNetworking是一個(gè)非常方便的網(wǎng)絡(luò)請(qǐng)求庫(kù),可以輕松實(shí)現(xiàn)各種網(wǎng)絡(luò)請(qǐng)求婚夫,比如經(jīng)常使用的GET請(qǐng)求新翎、POST請(qǐng)求,以及上傳多張圖片等该默,下面介紹一下基本的使用方法瞳氓。
首先下載AFNetworking 然后在需要使用的類中,導(dǎo)入如下2個(gè)頭文件:
ASIHttpRequest,有三年多沒(méi)更新,而且還是MRC赠叼,跟不上技術(shù)的發(fā)展了擦囊,在ARC基礎(chǔ)上全部都是使用AFNetWorking:ARC下的一個(gè)網(wǎng)絡(luò)請(qǐng)求庫(kù),還在不斷的更新嘴办,使用簡(jiǎn)單方便
發(fā)請(qǐng)求:全部都是異步請(qǐng)求瞬场,沒(méi)有同步請(qǐng)求的方法。使用manager可以發(fā)起GET/PUT/PATCH...請(qǐng)求.
(1.)創(chuàng)建網(wǎng)絡(luò)請(qǐng)求管理類? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];? ? ? ? ? ? ? ? ? ? ? ? ? AFNetworking:默認(rèn)只支持三種響應(yīng)頭:application/json? text/json? text/javascrip? ? ? ? ? ? 我們常用的還有一種:text/html 如果服務(wù)器需要該類型户辞,則設(shè)置下面的參數(shù)? ? ? ? ? ? ? ? ? ? ? ? ? ? (請(qǐng)求失斆诶唷:在error中出現(xiàn)類似 text/html 這種類型的參數(shù)是再設(shè)置).? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (2.)請(qǐng)求體? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];??????????????????????????????????????????????????????????????????????????????????????? (3.)get請(qǐng)求 ?????????????????????????? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? [manager GET:@"http://localhost:8080/Login/NewServlet?command=5"???????? parameters:nil?????? progress:^(NSProgress * _Nonnull downloadProgress) {???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? } success:^(NSURLSessionDataTask * _Nonnull task, id? _Nullable responseObject) {????????????????????????????????????????? //處理請(qǐng)求成功的事件????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? //AFNetworking:返回參數(shù)是json,AFNetworking會(huì)自動(dòng)返回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) {????????????????????????????????????????????????? //處理請(qǐng)求失敗的事件?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? NSLog(@"error -----> %@", error);????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? }];
請(qǐng)求數(shù)據(jù)格式???????????????????????????????????????????????????????????????????????????????????????????????????????????????????? AFHTTPRequestSerializer?????二進(jìn)制格式???????????????????????????????????????????????????????????????????? AFJSONRequestSerializer?????JSON??????????????????????????????????????????????????????????????? AFPropertyListRequestSerializer????PList(是一種特殊的XML,解析起來(lái)相對(duì)容易)?????????????????????????????????????????????????????? 響應(yīng)數(shù)據(jù)格式??????????????????????????????????????????????????????????????????????????????????????????????????????????????????? AFHTTPResponseSerializer?? 二進(jìn)制格式???????????????????????????????????????????????????????????????????? AFJSONResponseSerializer???JSON???????????????????????????????????????????????????????????????? AFXMLParserResponseSerializer?????XML,只能返回XMLParser,還需要自己通過(guò)代理方法解析??? AFXMLDocumentResponseSerializer?(Mac?OS?X)???????????????????????????????????????????? AFPropertyListResponseSerializer???PList?????????????????????????????????????????????????????? AFImageResponseSerializer??????????Image???????????????????????????????????????????????????????? AFCompoundResponseSerializer????? 組合
??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 請(qǐng)求數(shù)據(jù)格式??????????????????????????????????????????????????????????????????????????????????????????????????????????????? AFHTTPRequestSerializer?????二進(jìn)制格式??????????????????????????????????????????????????????????????????? AFJSONRequestSerializer?????JSON????????????????????????????????????????????????????????????????????? AFPropertyListRequestSerializer????PList(是一種特殊的XML,解析起來(lái)相對(duì)容易)
響應(yīng)數(shù)據(jù)格式?????????????????????????????????????????????????????????????????????????????????????????????????????????????????? AFHTTPResponseSerializer?? 二進(jìn)制格式?????????????????????????????????????????????????????????????????? AFJSONResponseSerializer???JSON?????????????????????????????????????????????????????????????????? AFXMLParserResponseSerializer?????XML,只能返回XMLParser,還需要自己通過(guò)代理方法解析?????????? AFXMLDocumentResponseSerializer?(Mac?OS?X)?????????????????????????????????????????? AFPropertyListResponseSerializer???PList???????????????????????????????????????????????????????????????? AFImageResponseSerializer??????? Image?????????????????????????????????????????????????????????????????????????????????????? AFCompoundResponseSerializer? ? ? 組合請(qǐng)求數(shù)據(jù)格式????????????????????????????????????????????????? AFHTTPRequestSerializer?????二進(jìn)制格式???????????????????????????????????????????????????????????????????? AFJSONRequestSerializer?????JSON?????????????????????????????????????????????????????????????? AFPropertyListRequestSerializer????PList(是一種特殊的XML,解析起來(lái)相對(duì)容易)
響應(yīng)數(shù)據(jù)格式????????????????????????????????????????????????????????????????????????????????????????????????????????????????? AFHTTPResponseSerializer?? 二進(jìn)制格式?????????????????????????????????????????????????????????????????? AFJSONResponseSerializer???JSON??????????????????????????????????????????????????????????????????? AFXMLParserResponseSerializer?????XML,只能返回XMLParser,還需要自己通過(guò)代理方法解析?? AFXMLDocumentResponseSerializer?(Mac?OS?X)??????????????????????????????????????????? AFPropertyListResponseSerializer???PList????????????????????????????????????????????????????? AFImageResponseSerializer??????????Image??????????????????????????????????????????????????????? AFCompoundResponseSerializer???????組合
(4.)POST請(qǐng)求???????????????????????????????????????????????????????????????????????????????? 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.)稍微插入一點(diǎn)小知識(shí)???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? //檢測(cè)網(wǎng)絡(luò)狀態(tài)?????????????????????????????????????????????????????????????????????????????????????????????????????????????? [manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {????????? if (status == 0) {?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? NSLog(@"沒(méi)有網(wǎng)絡(luò)");?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? }else if (status == 1) {?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? NSLog(@"移動(dòng)網(wǎng)絡(luò)");???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? }else if (status == 2) {?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? NSLog(@"WiFi");???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? }??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? }];
//開始檢測(cè)??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? [manager.reachabilityManager startMonitoring];
SDWebImage的使用? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 第一步刃榨,下載SDWebImage,導(dǎo)入工程双仍。???????????????????????????????????????????????????????????????????????? github托管地址https://github.com/rs/SDWebImage????????????????????????????????????????????????????????? 第二步枢希,在需要的地方導(dǎo)入頭文件? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #import "UIImageView+WebCache.h"????????????????????????????????????????????????????????????????????????????????
然后再說(shuō)說(shuō)加載圖片的一些流程? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1.入口setImageWithURL:placeholderImage:options: 會(huì)先把 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)存緩存中沒(méi)有,生成 NSInvocationOperation 添加到隊(duì)列開始從硬盤查找圖片是否已經(jīng)緩存翎卓。? ? ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 5.根據(jù) URLKey 在硬盤緩存目錄下嘗試讀取圖片文件契邀。這一步是在 NSOperation 進(jìn)行的操作,所以回主線程進(jìn)行結(jié)果回調(diào)notifyDelegate:失暴。????????????????????????????????????????????????????????????????????????? 6.如果上一操作從硬盤讀取到了圖片坯门,將圖片添加到內(nèi)存緩存中(如果空閑內(nèi)存過(guò)小,會(huì)先清空內(nèi)存緩存)逗扒。SDImageCacheDelegate 回調(diào)imageCache:didFindImage:forKey:userInfo:古戴。進(jìn)而回調(diào)展示圖片。???????????????????????????????????????????????????????????????????????????????????????????????????????????????? 7.如果從硬盤緩存目錄讀取不到圖片矩肩,說(shuō)明所有緩存都不存在該圖片现恼,需要下載圖片,回調(diào)imageCache:didNotFindImageForKey:userInfo:。???????????????????????????????????????????????????????????? 8.共享或重新生成一個(gè)下載器SDWebImageDownloader?開始下載圖片述暂。?????????????????????????????????? 9.圖片下載由 NSURLConnection 來(lái)做痹升,實(shí)現(xiàn)相關(guān) delegate 來(lái)判斷圖片下載中建炫、下載完成和下載失敗畦韭。????????????????????????????????????????????????????????????????????????????????????? 10.connection:didReceiveData:中利用 ImageIO 做了按圖片下載進(jìn)度加載效果。11.connectionDidFinishLoading:數(shù)據(jù)下載完成后交給?SDWebImageDecoder做圖片解碼處理肛跌。?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 12.圖片解碼處理在一個(gè) NSOperationQueue 完成艺配,不會(huì)拖慢主線程 UI。如果有需要對(duì)下載的圖片進(jìn)行二次處理衍慎,最好也在這里完成转唉,效率會(huì)好很多。?????????????????????????????????????????????????????????? 13.在主線程?notifyDelegateOnMainThreadWithInfo:宣告解碼完成稳捆,imageDecoder:didFinishDecodingImage:userInfo:回調(diào)給SDWebImageDownloader.???? 14.imageDownloader:didFinishWithImage:回調(diào)給 SDWebImageManager 告知圖片下載完成僻肖。?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 15.通知所有的 downloadDelegates 下載完成根欧,回調(diào)給需要的地方展示圖片。?????????????????????? 16.將圖片保存到 SDImageCache 中,內(nèi)存緩存和硬盤緩存同時(shí)保存余境。寫文件到硬盤也在以單獨(dú) NSInvocationOperation 完成,避免拖慢主線程嚎卫。???????????????????????????????????????????????? 17.SDImageCache 在初始化的時(shí)候會(huì)注冊(cè)一些消息通知勃救,在內(nèi)存警告或退到后臺(tái)的時(shí)候清理內(nèi)存圖片緩存,應(yīng)用結(jié)束的時(shí)候清理過(guò)期圖片甲脏。????????????????????????????????????????????????????????????????????? 18.SDWI 也提供了?UIButton+WebCache和?MKAnnotationView+WebCache眶熬,方便使用。19.SDWebImagePrefetcher可以預(yù)先下載圖片块请,方便后續(xù)使用????????????????????????????????????????????????
SDWebImage庫(kù)的作用還是要拿出來(lái)講一下? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 通過(guò)對(duì)UIImageView的類別擴(kuò)展來(lái)實(shí)現(xiàn)異步加載替換圖片的工作茂腥。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 主要用到的對(duì)象:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1、UIImageView (WebCache)類別切省,入口封裝最岗,實(shí)現(xiàn)讀取圖片完成后的回調(diào)? ? ? ? ? ? ? ? ? ? ? ? ? ? 2、SDWebImageManager朝捆,對(duì)圖片進(jìn)行管理的中轉(zhuǎn)站般渡,記錄那些圖片正在讀取。向下層讀取Cache(調(diào)用SDImageCache),或者向網(wǎng)絡(luò)讀取對(duì)象(調(diào)用SDWebImageDownloader) 驯用。實(shí)現(xiàn)SDImageCache和SDWebImageDownloader的回調(diào)脸秽。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 3、SDImageCache蝴乔,根據(jù)URL的MD5摘要對(duì)圖片進(jìn)行存儲(chǔ)和讀燃遣汀(實(shí)現(xiàn)存在內(nèi)存中或者存在硬盤上兩種實(shí)現(xiàn))實(shí)現(xiàn)圖片和內(nèi)存清理工作。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 4薇正、SDWebImageDownloader片酝,根據(jù)URL向網(wǎng)絡(luò)讀取數(shù)據(jù)(實(shí)現(xiàn)部分讀取和全部讀取后再通知回調(diào)兩種方式)????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? SDWebImage的用法還有很多,需要在日后的編程中去發(fā)現(xiàn)