基于AFNetworking3.X的二次封装及拓展

AFN3.X其实已经很封装的很好了,但是做项目的时候,总是有情况需要对网络统一处理,比如说缓存策略、重复请求管理功能,这些AFN3.1都没有提供直接的方法;比如每次请求回来,都有可能存在异常,我们肯定不能在每个请求里都加判断,所以就基于AFNetworking之上做了一层封装,向业务层更加友好。

概述

ZBNetworking是一个集约型框架,发起请求集中在一个类上,统一管理,适合中小型的项目,需要对网路请求进行更加细致的配置和管理,这个网络框架就可能不太适合,如果是大项目可以看一下YTKNetwork。框架目录如下 

重复请求

判断是否是同一个请求(依据是请求url和参数是否相同) 

1. GET:就判断请求的URL是否相同, 

2. POST:如果是POST请求,除了判断URL,还需判断请求体的内容是否相同(POST请求的参数放在HTTP body里);

- (BOOL)isTheSameRequest:(NSURLRequest*)request {if([self.HTTPMethodisEqualToString:request.HTTPMethod]) {if([self.URL.absoluteStringisEqualToString:request.URL.absoluteString]) {if([self.HTTPMethodisEqualToString:@"GET"] || [self.HTTPBodyisEqualToData:request.HTTPBody]) {NSLog(@"同一个请求还没执行完,又来请求☹️");returnYES;            }        }    }returnNO;}

遍历ZBNetworking当前的运行任务(调动currentRunningTasks获取当前的运行任务),根据任务源请求判断是否已经有相同的请求正在执行当中:

- (BOOL)haveSameRequestInTasksPool:(ZBURLSessionTask *)task {    __blockBOOLisSame =NO;    [[selfcurrentRunningTasks] enumerateObjectsUsingBlock:^(ZBURLSessionTask *obj, NSUInteger idx,BOOL* _Nonnull stop) {if([task.originalRequestisTheSameRequest:obj.originalRequest]) {            isSame  =YES;            *stop =YES;        }    }];returnisSame;}

如果有重复请求,取消新请求

//判断重复请求,如果有重复请求,取消新请求if([selfhaveSameRequestInTasksPool:session]) {        [session cancel];returnsession;    }

网络回调统一处理

可以在此方法里,根据业务需要添加判断

- (BOOL)networkResponseManage:(id)responseObject{    NSData *data =nil;NSError*error =nil;if([responseObject isKindOfClass:[NSData class]]) {        data = responseObject;    }elseif([responseObject isKindOfClass:[NSDictionaryclass]]){        data = [NSJSONSerialization dataWithJSONObject:responseObject options:NSJSONWritingPrettyPrinted error:&error];    }idjson = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];NSLog(@"%@",json);//统一判断所有请求返回状态,例如:-2就强制更新intstat =0;switch(stat) {case-1:{//强制退出returnNO;        }break;case-2:{//强制更新returnNO;        }break;case-3:{//弹出对话框returnNO;        }break;default:break;    }returnYES;}

缓存设计

先说说如何启动我们的缓存机制,GET和POST的API有一个cache参数,它用于给大家决定是否开启缓存机制,你可以根据自己的需要来决定是否开启cache,即时性和时效性的数据建议不开启缓存,一般建议开启,开启缓存后会回调两次,第一次获取是缓存数据,第二次获取的是最新的网络数据

NSURLCache的局限性,需要基于HTTP缓存机制的缓存方案需要客户端和服务器双边配合。所以我学习SDWebImage的缓存方案分两级缓存:内存缓存和磁盘缓存,缓存的过程如下:

第一次请求获取相应数据,先缓存到内存,再缓存到磁盘,下一次再发起相同的请求时,会先查找内存之中会不会有相应的缓存,如果有则返回缓存数据,如果没有,则向磁盘查找,如果磁盘存在缓存则返回,否则发起网络请求获取数据。

上面就是缓存的整一个过程,思路还是比较清晰,除此之外,缓存的设计还需要考虑两个问题: 

1. 缓存的淘汰策略 

2. 缓存的过期机制

ZBCacheManager是一个缓存管理类,暴露出简单的API给XDNetworking进行缓存的存取,底层是使用ZBMemoryCache(NSCache)进行内存缓存,使用ZBDiskCache(NSFileManager)进行磁盘缓存,缓存淘汰策略采用LRU算法(ZBLRUManager)。它是一个单例,通过一个全局入口统一访问:

+ (ZBCacheManager *)shareManager;


默认是磁盘大小是50MB,有效期是7天,如果想自定义设置,可以通过以下方法设置:

-(void)setCacheTime:(NSTimeInterval)time diskCapacity:(NSUInteger)capacity;


API设计

GET请求

/** *  GET请求 * * @paramurl              请求路径 * @paramcache            是否缓存 * @paramparams          拼接参数 * @paramprogressBlock    进度回调 * @paramsuccessBlock    成功回调 * @paramfailBlock        失败回调 * * @return返回的对象中可取消请求 */- (ZBURLSessionTask *)getWithUrl:(NSString *)url                          cache:(BOOL)cache                          params:(NSDictionary *)params                  progressBlock:(ZBGetProgress)progressBlock                    successBlock:(ZBResponseSuccessBlock)successBlock                      failBlock:(ZBResponseFailBlock)failBlock;

POST请求

/** *  POST请求 * * @paramurl              请求路径 * @paramcache            是否缓存 * @paramrefresh          解释同上 * @paramparams          拼接参数 * @paramprogressBlock    进度回调 * @paramsuccessBlock    成功回调 * @paramfailBlock        失败回调 * * @return返回的对象中可取消请求 */- (ZBURLSessionTask *)postWithUrl:(NSString *)url                  refreshRequest:(BOOL)refresh                            cache:(BOOL)cache                          params:(NSDictionary *)params                    progressBlock:(ZBPostProgress)progressBlock                    successBlock:(ZBResponseSuccessBlock)successBlock                        failBlock:(ZBResponseFailBlock)failBlock;

文件上传

/** *  文件上传 * *@paramurl              上传文件接口地址 *@paramdata            上传文件数据 *@paramtype            上传文件类型 *@paramname            上传文件服务器文件夹名 *@parammimeType        mimeType *@paramprogressBlock    上传文件路径 *@paramsuccessBlock    成功回调 *@paramfailBlock        失败回调 * *@return返回的对象中可取消请求 */- (ZBURLSessionTask *)uploadFileWithUrl:(NSString *)url                              fileData:(NSData *)datatype:(NSString *)typename:(NSString *)name                              mimeType:(NSString *)mimeType                          progressBlock:(ZBUploadProgressBlock)progressBlock                          successBlock:(ZBResponseSuccessBlock)successBlock                              failBlock:(ZBResponseFailBlock)failBlock;

多文件上传

/** *  多文件上传 * *@paramurl          上传文件地址 *@paramdatas        数据集合 *@paramtype          类型 *@paramname          服务器文件夹名 *@parammimeTypes      mimeTypes *@paramprogressBlock 上传进度 *@paramsuccessBlock  成功回调 *@paramfailBlock    失败回调 * *@return任务集合 */- (NSArray *)uploadMultFileWithUrl:(NSString *)url                        fileDatas:(NSArray *)datastype:(NSString *)typename:(NSString *)name                          mimeType:(NSString *)mimeTypes                    progressBlock:(ZBUploadProgressBlock)progressBlock                      successBlock:(ZBMultUploadSuccessBlock)successBlock                        failBlock:(ZBMultUploadFailBlock)failBlock;

文件下载

/** *  文件下载 * * @paramurl          下载文件接口地址 * @paramprogressBlock 下载进度 * @paramsuccessBlock  成功回调 * @paramfailBlock    下载回调 * * @return返回的对象可取消请求 */- (ZBURLSessionTask *)downloadWithUrl:(NSString *)url                        progressBlock:(ZBDownloadProgress)progressBlock                        successBlock:(ZBDownloadSuccessBlock)successBlock                            failBlock:(ZBDownloadFailBlock)failBlock;

获取当前正在运行的任务

/** *  正在运行的网络任务 * @returntask */- (NSArray *)currentRunningTasks;

取消GET请求

/**

*  取消GET请求

*/- (void)cancelRequestWithURL:(NSString *)url;

取消所有请求

/**

*  取消所有请求

*/- (void)cancleAllRequest;

获取缓存大小

/** *  获取缓存大小 * * @return缓存大小 */- (NSUInteger)totalCacheSize;

清除下载数据

/**

*  清除下载数据

*/- (void)clearDownloadData;

清除所有缓存

/**

*  清除所有缓存

*/- (void)clearTotalCache;


自动清理缓存

//每次网络请求的时候,检查此时磁盘中的缓存大小,阈值默认是50MB,如果超过阈值,则清理LRU缓//存,同时也会清理过期缓存,缓存默认SSL是7天,磁盘缓存的大小和SSL的设置可以通过该方法//[YQCacheManager shareManager] setCacheTime: diskCapacity:]设置。[[ZBCacheManager shareManager]clearLRUCache];



本文转载自https://blog.csdn.net/biyuhuaping/article/details/78721571

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容

  • AFN3.X其实已经很封装的很好了,但是做项目的时候,总是有情况需要对网络统一处理,比如说缓存策略、重复请求管理功...
    biyuhuaping阅读 435评论 0 1
  • 文章原网址点击>>>>>>>>HYBNetworking 概述 对于开发人员来说,学习网络层知识是必备的,任何一款...
    Amok校长阅读 2,369评论 1 3
  • 下载 下载管理器 SDWebImageDownLoader作为一个单例来管理图片的下载操作。图片的下载是放在一个N...
    wind_dy阅读 1,445评论 0 1
  • 前言 之前做项目的时候,由于需要重构网络层,所以自己参考网上的方法对AFNeworking做了一次二次封装,我把一...
    小球why阅读 10,978评论 9 48
  • 虽有许多话想对你说,但真的无从下口。原谅的我懦弱。 心情不会一直都消沉下去,明天的阳光照样升起,明天的音乐课...
    有小橘阅读 106评论 0 0