您的位置:首页 > 其它

AFN框架封装思路(新版本)

2016-03-09 11:37 204 查看
在开发项目中避免第三方框架对项目的侵入性,很多需要对第三方框架进行封装,方便以后的框架的变动,项目的管理.下面就自己来说一说自己在项目中,怎么封装的AFN框架.

第一步,提供接口供外界调用,传入参数,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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: