iOS数据库离线缓存思路和网络层封装——网络请求基类封装
2016-04-16 00:11
549 查看
.h文件
.m文件
#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
相关文章推荐
- iOS数据库离线缓存思路和网络层封装——数据缓存机制Model封装
- iOS数据库离线缓存思路和网络层封装——数据缓存操作封装
- 自己封装的网络请求
- Python实现简单的HTTP服务器(支持文件上传下载)
- 网络编程--HTTP协议访问网络
- 网络体系结构
- 【码上杂谈】关于之前对Server上允许的最大TCP连接数理解错误的更正
- HTTP协议中的短轮询、长轮询、长连接和短连接
- http协议详解之响应篇
- 网络编程--WebView
- HTTP 错误 404.2 - Not Found 由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面。
- [置顶] 浅谈TCP/IP协议栈(一)入门知识
- 网络安全攻防学习平台 - 基础关
- OkHttp使用介绍
- Java Socket网络编程的经典例子
- Android获取网络资源
- AJAX系列二之XMLHttpRequest的请求和响应
- Golang实现http文件上传小功能
- wireshark解密https数据包方法
- 【bzoj3532】[Sdoi2014]Lis 网络流退流