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

.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
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
#import <Foundation/Foundation.h> typedef void(^SuccessBlock)(NSDictionary *returnDic, NSString *msg); typedef void(^FailureBlock)(NSString *errorInfo); typedef void(^LoadProgress)(float progress); @interface CBCacheHttpRequet : NSObject /** * Get请求 不对数据进行缓存 * * @param urlStr url * @param success 成功的回调 * @param failure 失败的回调 */ +(void)getRequestUrlStr:(NSString *)urlStr success:(SuccessBlock)success failure:(FailureBlock)failure; /** * Get请求 对数据进行缓存 * * @param urlStr url * @param success 成功的回调 * @param failure 失败的回调 */ +(void)getRequestCacheUrlStr:(NSString *)urlStr success:(SuccessBlock)success failure:(FailureBlock)failure ; /** * Post请求 不对数据进行缓存 * * @param urlStr url * @param parameters post参数 * @param success 成功的回调 * @param failure 失败的回调 */ +(void)postRequestUrlStr:(NSString *)urlStr withDic:(NSDictionary *)parameters success:(SuccessBlock )success failure:(FailureBlock)failure; /** * Post请求 对数据进行缓存 * * @param urlStr url * @param parameters post参数 * @param success 成功的回调 * @param failure 失败的回调 */ +(void)postRequestCacheUrlStr:(NSString *)urlStr withDic:(NSDictionary *)parameters success:(SuccessBlock )success failure:(FailureBlock)failure; /** * 上传单个文件 * * @param urlStr 服务器地址 * @param parameters 参数 * @param imageStr 上传的key * @param imageData 上传的问件 * @param loadProgress 上传的进度 * @param success 成功的回调 * @param failure 失败的回调 */ +(void)upLoadDataWithUrlStr:(NSString *)urlStr withDic:(NSDictionary *)parameters imageKey:(NSString *)imageStr withImageData:(NSData *)imageData upLoadProgress:(LoadProgress)loadProgress success:(SuccessBlock)success failure:(FailureBlock)failure; //清除接口数据缓存 +(void)deleteCache; @end

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

番薯大佬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值