AFN框架封装思路(新版本)
2016-03-09 11:37
204 查看
在开发项目中避免第三方框架对项目的侵入性,很多需要对第三方框架进行封装,方便以后的框架的变动,项目的管理.下面就自己来说一说自己在项目中,怎么封装的AFN框架.
第一步,提供接口供外界调用,传入参数,block返回请求到的数据,提供了四个接口方法,post请求,get请求,图片post请求
第二步,写一个缓存工具类(Cache类),实现本地的缓存,判断缓存是否超时,重新请求.
在工具类中提供给外部接口方法,传入参数,block返回是否写入,或者是否取得本地缓存数据
下面来说下AFN主要代码实现:
post请求:
欢迎大家查看源码:https://github.com/anywhereIOS/AFN-.git
第一步,提供接口供外界调用,传入参数,block返回请求到的数据,提供了四个接口方法,post请求,get请求,图片post请求
typedef void (^DownloadFinishedBlock)(NSData *requestData,NSDictionary *requestDict,NSError *error); @interface HttpRequest : NSObject /** * post请求 * * @param urlString 网址 * @param dict 字典 * @param finsihedBlock 返回数据 * @param isCache 是否缓存 */ -(void)PostWithUrlString:(NSString *)urlString parms:(NSDictionary *)dict finished:(DownloadFinishedBlock)finsihedBlock isCache:(BOOL)isCache; - (void)PostWithUrlString:(NSString *)urlString isBoody:(BOOL)need parms:(NSDictionary *)dict finished:(DownloadFinishedBlock)finishedBlock isCache:(BOOL)isCache; /** * Get请求 * * @param urlString 网址 * @param dict 字典 * @param finishedBlock 返回数据 * @param isCach 是否缓存 */ - (void)GetWithUrlString:(NSString *)urlString parms:(NSDictionary *)dict finished:(DownloadFinishedBlock)finishedBlock isCache:(BOOL)isCach; /** * 上传image * * @param urlString 网址 * @param dict 其他普通数据的字典 * @param images images的数组 * @param finishdeBlock 返回结果 */ -(void)PostDataWithUrlString:(NSString *)urlString parm在方法中判断是否需要缓存到本地,缓存到本地的数据是不是超时,所以在接下来实现缓存工具类
第二步,写一个缓存工具类(Cache类),实现本地的缓存,判断缓存是否超时,重新请求.
在工具类中提供给外部接口方法,传入参数,block返回是否写入,或者是否取得本地缓存数据
typedef void (^isCleanCacheSuccess) (BOOL success); typedef void (^isGetCacheSuccess) (BOOL success,id requestObjc); @interface Cache : NSObject @property (nonatomic,strong) NSString *homePath; +(Cache *)cache; -(void)writeFile:(id)object toPath:(NSString *)path; -(void)getFileWithPath:(NSString *)path isSuccess:(isGetCacheSuccess)success; -(NSString *)getPath:(NSString *)path; /**判断缓存是否存在是否超时,正常情况下返回yes说明需要重新请求数据*/ -(BOOL)cacheIsExistAndIsNoOutTimeWithPath:(NSString *)path time:(NSTimeInterval)time; /**清理所有缓存*/ -(void)cleanCacheWithSuccess:(isCleanCacheSuccess)success; /**计算path文件下文件的总大小*/ -(double)fileSizeForDir:(NSString *)path; /**计算所有的缓存文件的大小*/ -(double)allFileSizeWithCache; /**缓存的目录*/ -(NSString *)getCachesPath; -(void)cleanCacheWithPathStr:(NSString *)path;在这个工具类中,对于需要加密的数据,需要加密,所以引入了MD5进行加密处理.然后又使用了NSFileManager的分类来计算缓存文件的大小,是否超时等
下面来说下AFN主要代码实现:
post请求:
AFHTTPSessionManager *sessionManager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:@"http://test.cn/"]]; AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey]; securityPolicy.allowInvalidCertificates = YES; sessionManager.securityPolicy = securityPolicy; sessionManager.responseSerializer = [AFHTTPResponseSerializer serializer]; sessionManager.requestSerializer.timeoutInterval = 10*4; sessionManager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",@"text/json",@"text/plain",@"text/html", nil]; [sessionManager.requestSerializer setValue:ProtocolVerNO forKey:ProtocolVer]; //储存用户信息 NSString *userId = restoreValueForKey(UserId);//从本地取出userid if (userId) { [sessionManager.requestSerializer setValue:userId forHTTPHeaderField:UserId]; } NSString *ptToken = restoreValueForKey(PtToken); if (ptToken) { [sessionManager.requestSerializer setValue:ptToken forHTTPHeaderField:PtToken]; } // [sessionManager POST:urlString parameters:dict isBody:need success:^(NSURLSessionDataTask *task, id responseObject) { if ([responseObject isKindOfClass:[NSDictionary class]]) { finishedBlock(responseObject,responseObject,nil); }else{//不是字典 NSError *error = nil; NSDictionary *dataDict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:&error]; finishedBlock(responseObject,dataDict,nil); } //需要储存数据,就存到本地 if (isCache) { NSString *path = [self appendCacheUrlStringPath:urlString WithDict:dict]; [[Cache cache] writeFile:responseObject toPath:path]; } } failure:^(NSURLSessionDataTask *task, NSError *error) { finishedBlock(nil,nil,error); application.networkActivityIndicatorVisible = NO; }];get请求:
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:@"http://test.rest.parteam.cn/"]]; manager.responseSerializer = [[AFHTTPResponseSerializer alloc] init]; manager.requestSerializer.timeoutInterval = 60*4; AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey]; securityPolicy.allowInvalidCertificates = YES; manager.securityPolicy = securityPolicy; [manager GET:urlString parameters:dict success:^(NSURLSessionDataTask *task, id responseObject) { NSDictionary *dataDict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil]; finishedBlock(responseObject,dataDict,nil); if (isCach) { NSString *path = [self appendCacheUrlStringPath:urlString WithDict:dict]; [[Cache cache] writeFile:responseObject toPath:path]; } } failure:^(NSURLSessionDataTask *task, NSError *error) { finishedBlock(nil,nil,error); }];图片上传post请求:
[manager POST:urlString parameters:dict constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { if (images.count != 0) { for (NSInteger i = 0; i<images.count; i++) { NSData *imageData = images[i]; [formData appendPartWithFileData:imageData name:[NSString stringWithFormat:@"file%ld",i] fileName:[NSString stringWithFormat:@"image%ld.%@",i,returnImagesType([images objectAtIndex:i])] mimeType:[NSString stringWithFormat:@"file/%@",returnImagesType([images objectAtIndex:i])]]; } } } success:^(NSURLSessionDataTask *task, id responseObject) { NSDictionary *dataDict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil]; finishdeBlock(responseObject,dataDict,nil); } failure:^(NSURLSessionDataTask *task, NSError *error) { finishdeBlock(nil,nil,error); }];
欢迎大家查看源码:https://github.com/anywhereIOS/AFN-.git
相关文章推荐
- Git常用命令总结
- 学习进度条
- requirejs学习笔记
- 【SSH进阶之路】Hibernate搭建开发环境+简单实例(二)
- Viewpager+底部菜单栏
- linux用户登陆显示:could not open session .
- Android环境介绍及配置详细大全
- 谈谈面试经历
- Android日期格式化
- 夺命雷公狗---微信开发54----微信js-sdk接口开发(1)之快速入门
- Linux与JVM的内存关系分析
- web页面中会出现null页面的bug
- pat1039:到底买不买
- 矩阵及一些数学小技巧的学习笔记(不断补充中)
- Android编程实现从字符串中查找电话号码的方法
- IP地址正则表达式匹配方法
- List<String>和String相互转换
- 性能测试-监控Mysql慢查询
- Log4J的配置文件
- DOM--sql server