.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