iOS数据库离线缓存思路和网络层封装——网络请求基类封装
来源:互联网 发布:宿州智慧云计算产业园 编辑:程序博客网 时间:2024/05/02 00:17
.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
0 0
- iOS数据库离线缓存思路和网络层封装——网络请求基类封装
- iOS数据库离线缓存思路和网络层封装——数据缓存操作封装
- iOS数据库离线缓存思路和网络层封装——数据缓存机制Model封装
- iOS数据库离线缓存思路和网络层封装
- iOS 数据库离线缓存思路和网络层封装
- iOS数据库离线缓存思路和网络层封装
- iOS 数据库离线缓存思路和网络层封装
- iOS数据库离线缓存思路和网络层封装
- iOS数据库离线缓存思路和网络层封装——原理
- iOS 网络请求类封装
- iOS--封装网络请求 ——实例
- iOS——封装网络请求
- iOS封装网络请求
- iOS ---网络请求封装(自动缓存与手动缓存)
- iOS 基于AF网络请求封装的简易思路
- ios 网络请求数据封装类
- ios中封装网络请求类
- ios中封装网络请求类
- 为什么毕业三四年之后,同学之间的差距会这么大?
- 练习二1015
- 23.Java IO: Serializable && StreamTokenizer
- Opengl备忘4---Texture
- 奇怪的lib形式
- iOS数据库离线缓存思路和网络层封装——网络请求基类封装
- MATLAB中plot()画图的颜色线型参数设置
- SCI论文及期刊查询
- 十年研发经验工程师的嵌入式学习书籍大推荐
- The patch E:\android-sdk-windows does not belong to a directory.Android studio will use this Andriod
- CF 41A Translation
- 入门TrafficServer插件开发的正确姿势
- 为什么打印log(比如printf)会经常碰到core dump?
- 从尾到头打印链表