您的位置:首页 > 理论基础 > 计算机网络

iOS数据库离线缓存思路和网络层封装——网络请求基类封装

2016-04-16 00:11 549 查看
.h文件

#import <Foundation/Foundation.h>
#import "MKNetworkEngine.h"
#import "SYNetworkCache.h"

@interface BaseModel :NSObject

///带缓存的网络请求(自定义缓存类型及缓存时间)
+ (MKNetworkOperation *)postDataResponsePath:(NSString *)path
params:(NSMutableDictionary *)params
target:(id)target
cacheType:(NetworkCacheType)type
cacheTime:(NSTimeInterval)time
onCompletion:(void (^)(id data,BOOL isReachable))completionBlock;

@end


.m文件

#import "BaseModel.h"

@implementation BaseModel

///带缓存的网络请求(自定义缓存类型及缓存时间)
+ (MKNetworkOperation *)postDataResponsePath:(NSString *)path
params:(NSMutableDictionary *)params
target:(id)target
cacheType:(NetworkCacheType)type
cacheTime:(NSTimeInterval)time
onCompletion:(void (^)(id data,BOOL isReachable))completionBlock
{
// kServerHost为宏定义接口地址
MKNetworkEngine *engine = [[MKNetworkEnginealloc]initWithHostName:kServerHost];
MKNetworkOperation *networkOperation = [engineoperationWithPath:pathparams:paramshttpMethod:@"POST"ssl:NO];

// 网络状态-有网无网
BOOL isReachable = [engineisReachable];

// 请求数据模式
networkOperation.postDataEncoding =MKNKPostDataEncodingTypeJSON;
//网络冻结(恢复网络时重新开始)
[networkOperation setFreezable:YES];

//是否要做缓存处理
NSString *cacheKey = [selfgetCacheKeyWithUrl:networkOperation.urlparams:params];
if (type ==NetworkCacheTypeNever || type ==NetworkCacheTypeAlways)
{
//情况1不做缓存,总是重新请求网络
//情况2无视缓存,总是重新请求网络
[selfnetworkRequest:engineoperation:networkOperationtype:typecacheKeykey:cacheKeycacheTime:timereachable:isReachableonCompletion:completionBlock];
}
elseif (type ==NetworkCacheTypeWhileOverdue)
{
//如果存在缓存,且数据没有过期则使用缓存,否则重新请求网络
NSData *cacheData = [[SYNetworkCacheshareCache]getNetworkCacheContentWithCacheKey:cacheKey];
if (cacheData)
{
// 使用缓存
if (completionBlock)
{
NSDictionary *dict = [NSJSONSerializationJSONObjectWithData:cacheDataoptions:0error:nil];
completionBlock(dict, isReachable);
}
}
else
{
// 重新请求网络
[selfnetworkRequest:engineoperation:networkOperationtype:typecacheKeykey:cacheKeycacheTime:timereachable:isReachableonCompletion:completionBlock];
}
}

return networkOperation;
}

+ (void)networkRequest:(MKNetworkEngine *)engine operation:(MKNetworkOperation *)networkOperation type:(NetworkCacheType)type cacheKeykey:(NSString *)cacheKey cacheTime:(NSTimeInterval)cacheTime reachable:(BOOL)isReachable onCompletion:(void (^)(id data,BOOL isReachable))completionBlock
{
[networkOperation addCompletionHandler:^(MKNetworkOperation *operation){

NSDictionary *response = operation.responseJSON;

if (type ==NetworkCacheTypeAlways || type ==NetworkCacheTypeWhileOverdue)
{
[[SYNetworkCacheshareCache]deleteNetworkCacheWithKey:cacheKey];
[[SYNetworkCacheshareCache]saveNetworkCacheData:operation.responseDatacachekey:cacheKeycacheTime:cacheTime];
}

if (completionBlock)
{
completionBlock(response, isReachable);
}

}errorHandler:^(MKNetworkOperation *completedOperation,NSError *error){

NSDictionary *dic = [selfgetErrorDictionaryWithError:errornetwork:isReachable];

if (completionBlock)
{
completionBlock(dic, isReachable);
}
}];
[engine enqueueOperation:networkOperation];
}

/// 缓存key
+ (NSString *)getCacheKeyWithUrl:(NSString *)url params:(NSDictionary *)dict
{
NSMutableString *cacheKey = [NSMutableStringstringWithFormat:@"%@", url];
if (dict)
{
NSString *keyValue = [dictjsonEncodedKeyValueString];
[cacheKey appendFormat:@"/%@", keyValue];
}

return cacheKey;
}

@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: