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
原创粉丝点击