利用YYCache和AFN实现网络数据缓存

背景

  • 网络比较差的情况为了提高用户体验需要先显示旧的数据,拿到新数据在更新
  • 对于短时间内变化不大的数据,用户重复获取数据不仅浪费浏览也增大服务器的压力

xmind图

网络请求.png

项目类

主要分为缓存类HZNetWorkCache、配置类HZNetworkConfig、网络请求类HZNetworkManager

HZNetWorkCache

  • 缓存类比较简单,主要实现数据的存储,基于YYCache
  • 将网络请求的连接和提交的参数拼接作为key
  • 将网络请求后台返回的数据作为value
  • 设置缓存时间,每次读取缓存都先校验缓存时间的有效性
    1)将网络请求的连接和提交的参数、"_HZNetworkTimeOut"(常量,可随意)拼接作为key
    2)将缓存时间作为value
HZNetWorkCache代码

ps:这个类的代码主要从网上找的,稍加了修改

static NSString *const HZNetworkCache = @"HZNetworkCache";
static NSString *const HZNetworkTimeOut = @"HZNetworkTimeOut";

@implementation HZNetWorkCache
static YYCache *_dataCache;

+ (void)initialize {
    _dataCache = [YYCache cacheWithName:HZNetworkCache];
}


/**
 异步缓存网络数据,根据请求的 URL与parameters
 做KEY存储数据, 这样就能缓存多级页面的数据
 
 @param httpData 服务器返回的数据
 @param URL 请求的URL地址
 @param parameters 请求的参数
 
 */
+ (void)setHttpCache:(id)httpData URL:(NSString *)URL parameters:(NSDictionary *)parameters {
    NSString *cacheKey = [self cacheKeyWithURL:URL parameters:parameters];
    [_dataCache setObject:httpData forKey:cacheKey withBlock:nil];
    //缓存请求过期时间
    [self setCacheInvalidTimeWithCacheKey:cacheKey];
}


/**
 根据请求的 URL与parameters 同步取出缓存数据
 
 @param URL 请求的URL
 @param parameters 请求的参数
 @param cacheValidTime 数据缓存时间
 @return 缓存的数据
 
 */
+ (id)httpCacheForURL:(NSString *)URL parameters:(NSDictionary *)parameters cacheValidTime:(NSTimeInterval)cacheValidTime {
    NSString *cacheKey = [self cacheKeyWithURL:URL parameters:parameters];
    id cache = [_dataCache objectForKey:cacheKey];

    if (!cache) {
        return nil;
    }

    if ([self verifyInvalidCache:cacheKey resultCacheDuration:cacheValidTime]) {
        return cache;
    }else{
        [_dataCache.diskCache removeObjectForKey:cacheKey];
        NSString *cacheDurationKey = [NSString stringWithFormat:@"%@_%@",cacheKey, HZNetworkTimeOut];
        [_dataCache.diskCache removeObjectForKey:cacheDurationKey];
        return nil;
    }

}

/**
 获取缓存,不考虑缓存是否有效
 
 @param URL 请求的URL
 @param parameters 请求的参数
 @return 缓存的数据
 
 */
+ (id)httpCacheForURL:(NSString *)URL parameters:(NSDictionary *)parameters {
    NSString *cacheKey = [self cacheKeyWithURL:URL parameters:parameters];
    return [_dataCache objectForKey:cacheKey];
}

/**
 获取网络缓存的总大小 bytes(字节)
 
 @return 大小
 */
+ (NSInteger)getAllHttpCacheSize {
    return [_dataCache.diskCache totalCost];
}

/**
 删除所有网络缓存
 */
+ (void)removeAllHttpCache {
    [_dataCache.memoryCache removeAllObjects];
    [_dataCache.diskCache removeAllObjectsWithProgressBlock:^(int removedCount, int totalCount) {
        
    } endBlock:^(BOOL error) {
        
    }];
}

/**
 删除缓存
 
 @param url url
 @param parameters 参数
 */
+ (void)removeHttpCacheWithUrl:(NSString *)url parameters:(NSDictionary *)parameters {
    NSString *cacheKey = [self cacheKeyWithURL:url parameters:parameters];
    NSString *cacheTimeKey = [NSString stringWithFormat:@"%@_%@", cacheKey, HZNetworkTimeOut];
    [_dataCache.memoryCache removeObjectForKey:cacheKey];
    [_dataCache.diskCache removeObjectForKey:cacheKey withBlock:^(NSString * _Nonnull key) {

    }];
    [_dataCache.memoryCache removeObjectForKey:cacheTimeKey];
    [_dataCache.diskCache removeObjectForKey:cacheTimeKey withBlock:^(NSString * _Nonnull key) {
        
    }];
}


/**
 拼接key

 @param URL url
 @param parameters 提交的参数
 @return key
 */
+ (NSString *)cacheKeyWithURL:(NSString *)URL parameters:(NSDictionary *)parameters {
    if(!parameters || parameters.count == 0){return URL;};
    // 将参数字典转换成字符串
    NSData *stringData = [NSJSONSerialization dataWithJSONObject:parameters options:0 error:nil];
    NSString *paraString = [[NSString alloc] initWithData:stringData encoding:NSUTF8StringEncoding];
    NSString *cacheKey = [NSString stringWithFormat:@"%@%@", URL, paraString];

    return [NSString stringWithFormat:@"%@",cacheKey];
}



/** 存入缓存创建时间 */
+ (void)setCacheInvalidTimeWithCacheKey:(NSString *)cacheKey {
    NSString *cacheDurationKey = [NSString stringWithFormat:@"%@_%@",cacheKey, HZNetworkTimeOut];
    NSTimeInterval nowTime = [[NSDate date] timeIntervalSince1970];
    [_dataCache setObject:@(nowTime) forKey:cacheDurationKey withBlock:nil];
}

/** 判断缓存是否有效,有效则返回YES */
+ (BOOL)verifyInvalidCache:(NSString *)cacheKey resultCacheDuration:(NSTimeInterval )resultCacheDuration {
    //获取该次请求失效的时间戳
    NSString *cacheDurationKey = [NSString stringWithFormat:@"%@_%@",cacheKey, HZNetworkTimeOut];
    id createTime = [_dataCache objectForKey:cacheDurationKey];
    NSTimeInterval createTime1 = [createTime doubleValue];
    NSTimeInterval nowTime = [[NSDate date] timeIntervalSince1970];
    if ((nowTime - createTime1) < resultCacheDuration) {
        return YES;
    }
    return NO;
}

HZNetworkConfig

该类主要用于网络请求配置

  • baseURL(NSString)网络请求基链
  • requestSerializer(AFHTTPRequestSerializer)请求的一些配置(默认不变的信息)
  • responseSerializer(AFHTTPResponseSerializer)对返回的数据进行序列化,默认使用 AFJSONResponseSerializer
  • builtinHeaders (NSMutableDictionary)请求的头部通用配置
  • builtinBodys(NSMutableDictionary)请求体通用配置
  • timeoutInterval(NSTimeInterval) 请求超时时间设置,默认10秒
  • resultCacheDuration(NSInteger)设置缓存时间,默认7246060秒(724小时)。如果 <= 0,表示不启用缓存。单位为秒,表示对于一个请求的结果缓存多长时间
  • requestCachePolicy(HZRequestCachePolicy)缓存策略, 默认是HZRequestCacheOrLoadToCache
  • (^ resposeHandle)(NSURLSessionTask *dataTask, id responseObject) 对请求返回的数据做统一的处理,比如token失效、重新登录等等操作。

缓存策略

typedef NS_ENUM(NSUInteger, HZRequestCachePolicy) {
    /** HZRequestCacheOrLoadToCache, HZRequestCacheAndLoadToCache, HZRequestLoadToCache这三种方式如果网络请求失败且有缓存数据则直接返回缓存数据(不管缓存数据是否有效),如果不存在缓存则直接返回failured */
    HZRequestCacheOrLoadToCache,//如果缓存有效则直接返回缓存,不再load。缓存失效则load返回,且缓存数据,用于同一个网络请求在一定时间内不多次发起网络请求
    HZRequestCacheDontLoad,//如果缓存有效则直接返回缓存,缓存失效则返回nil,不再load
    HZRequestCacheAndLoadToCache,//如果缓存有效则直接返回缓存,并且load且缓存数据。缓存失效则load返回,且缓存数据
    HZRequestLoadToCache,//直接load并返回数据,且缓存数据,如果load失败则读取缓存数据
    HZRequestLoadDontCache,//直接load并返回数据,不缓存数据,如果load失败则直接抛出Error
};
const CGFloat HZRequestTimeoutInterval = 10.0f;


@implementation HZNetworkConfig
- (instancetype)init {
    self = [super init];
    if (self) {
        _timeoutInterval = HZRequestTimeoutInterval;
        _requestCachePolicy = HZRequestCacheAndLoadToCache;
        _resultCacheDuration = 7*24*60*60;
    }
    return self;
}

- (AFHTTPRequestSerializer *)requestSerializer {
    if (!_requestSerializer) {
        _requestSerializer = [AFHTTPRequestSerializer serializer];
        _requestSerializer.timeoutInterval = _timeoutInterval;
    }
    return _requestSerializer;
}

- (AFHTTPResponseSerializer *)responseSerializer {
    if (!_responseSerializer) {
        _responseSerializer = [AFJSONResponseSerializer serializer];
    }
    return _responseSerializer;
}

- (instancetype)copyWithZone:(NSZone *)zone {
    HZNetworkConfig *configuration = [[HZNetworkConfig alloc] init];
    configuration.resultCacheDuration = self.resultCacheDuration;
    configuration.requestCachePolicy = self.requestCachePolicy;
    configuration.baseURL = [self.baseURL copy];
    configuration.builtinHeaders = [self.builtinHeaders copy];
    configuration.builtinBodys = [self.builtinBodys copy];
    configuration.resposeHandle = [self.resposeHandle copy];
    configuration.requestSerializer = [AFHTTPRequestSerializer serializer];
    configuration.requestSerializer.timeoutInterval = self.requestSerializer.timeoutInterval;
//    configuration.requestSerializer = [self.requestSerializer copy];
    configuration.responseSerializer = [self.responseSerializer copy];
    configuration.responseSerializer.acceptableContentTypes = self.responseSerializer.acceptableContentTypes;
    return configuration;
}

@end

HZNetworkManager

发起网络请求,单例

/单例方法
+ (instancetype)sharedInstance{
   return [[self alloc] init];
}

- (instancetype)init {
   static dispatch_once_t onceToken;
   dispatch_once(&onceToken, ^{
       instance = [super init];
       if (self) {
           [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
               NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status));
               instance.networkStatus = status;
           }];
           [[AFNetworkReachabilityManager sharedManager] startMonitoring];
           
           instance.configuration = [[HZNetworkConfig alloc] init];
           
           _methodMap = @{
                          @"0" : @"POST",
                          @"1" : @"GET",
                          @"2" : @"HEAD",
                          @"3" : @"PUT",
                          @"4" : @"DELETE",
                          };
           if (!_cacheKeys) {
               _cacheKeys = [NSMutableDictionary dictionary];
           }
       }
   });
   return instance;
}

//alloc会调用allocWithZone,确保使用同一块内存地址
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
   static dispatch_once_t onceToken;
   dispatch_once(&onceToken, ^{
       instance = [super allocWithZone:zone];
   });
   return instance;
}
//copy的时候会调用copyWithZone
- (id)copyWithZone:(NSZone *)zone{
   return instance;
}
+ (id)copyWithZone:(struct _NSZone *)zone{
   return instance;
}
+ (id)mutableCopyWithZone:(struct _NSZone *)zone{
   return instance;
}
- (id)mutableCopyWithZone:(NSZone *)zone{
   return instance;
}
#pragma mark - 实例化
- (AFHTTPSessionManager *)requestManager {
   if (!_requestManager) {
       NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
       NSString *key = [userDefault objectForKey:HZNetworkManagerCharles];
       if ([key isEqualToString:@"1"]) {
           // debug 版本的包仍然能够正常抓包
           _requestManager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:@"https://www.baidu.com"]];
       }else {//禁止抓包
           NSURLSessionConfiguration *conf = [NSURLSessionConfiguration ephemeralSessionConfiguration];
           conf.connectionProxyDictionary = @{};
           _requestManager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:@"https://www.baidu.com"] sessionConfiguration:conf];
       }
       AFSecurityPolicy *securityPolicy = [AFSecurityPolicy defaultPolicy];
       securityPolicy.allowInvalidCertificates = YES;
       securityPolicy.validatesDomainName = NO;
       _requestManager.securityPolicy = securityPolicy;
   }
   return _requestManager;
}

/**
 网络请求

 @param method 请求方法
 @param URLString 请求URL地址,不包含baseUrl
 @param parameters 请求参数
 @param configurationHandler 将默认的配置给到外面,外面可能需要特殊处理,可以修改baseUrl等信息
 @param cache  如果有的话返回缓存数据
 @param successed 请求成功
 @param failured 请求失败
 @return task
 */
- (NSURLSessionDataTask *_Nullable)requestMethod:(HZRequestMethod)method
                                       URLString:(NSString *_Nullable)URLString
                                      parameters:(NSDictionary *_Nullable)parameters
                            configurationHandler:(void (^_Nullable)(HZNetworkConfig * _Nullable configuration))configurationHandler
                                           cache:(HZRequestManagerCache _Nullable )cache
                                         successed:(HZRequestManagerSuccess _Nullable )successed
                                         failured:(HZRequestManagerFailure _Nullable )failured {
    HZNetworkConfig *configuration = [self disposeConfiguration:configurationHandler];
    if (!URLString) {
        URLString = @"";
    }
    NSString *requestUrl = [NSString stringWithFormat:@"%@/%@", configuration.baseURL, URLString];
    parameters = [self disposeRequestParameters:parameters];
    
    //获取缓存数据
    id (^fetchCacheRespose)(void) = ^id (void) {
        id resposeObject = [HZNetWorkCache httpCacheForURL:requestUrl parameters:parameters cacheValidTime:configuration.resultCacheDuration];
        if (resposeObject) {
            return resposeObject;
        }
        return nil;
    };
    
    //判断数据的返回
    if (configuration.requestCachePolicy == HZRequestCacheDontLoad || configuration.requestCachePolicy == HZRequestCacheAndLoadToCache || configuration.requestCachePolicy == HZRequestCacheOrLoadToCache) {
        id resposeObject = fetchCacheRespose();
        cache(resposeObject, nil);
        
        if ((configuration.requestCachePolicy == HZRequestCacheOrLoadToCache ) && resposeObject) {
            return nil;
        }
        
        if (configuration.requestCachePolicy == HZRequestCacheDontLoad) {
            return nil;
        }
    }
    
    //存数据
    void (^ saveCacheRespose)(id responseObject) = ^(id responseObject) {
        if (configuration.resultCacheDuration > 0) {
            [HZNetWorkCache setHttpCache:responseObject URL:requestUrl parameters:parameters];
        }
    };
    
    //接口请求
    if (method > self.methodMap.count - 1) {
        method = self.methodMap.count - 1;
    }
    NSString *methodKey = [NSString stringWithFormat:@"%d", (int)method];
    NSURLRequest *request = [self.requestManager.requestSerializer requestWithMethod:self.methodMap[methodKey]
                                                                           URLString:requestUrl
                                                                          parameters:parameters
                                                                               error:nil];
    dispatch_async(dispatch_get_main_queue(), ^{
       [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
    });
    __weak typeof(self) weakself = self;
    
    __block NSURLSessionDataTask *dataTask = [self.requestManager dataTaskWithRequest:request uploadProgress:nil downloadProgress:nil completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
        dispatch_async(dispatch_get_main_queue(), ^{
            [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
        });
        if (error) {
            if (configuration.requestCachePolicy == HZRequestLoadToCache || ((configuration.requestCachePolicy == HZRequestCacheOrLoadToCache || configuration.requestCachePolicy == HZRequestCacheAndLoadToCache)&& fetchCacheRespose() == nil)) {//如果网络请求失败,则直接取缓存数据
                id resposeObject = [HZNetWorkCache httpCacheForURL:requestUrl parameters:parameters];
                resposeObject ? cache(resposeObject, error) : failured(dataTask, error, weakself.networkStatus);
            }else {
                failured(dataTask, error, weakself.networkStatus);
            }
            
        }else {
            if (configuration.requestCachePolicy != HZRequestLoadDontCache) {
                saveCacheRespose(responseObject);
            }
            if (configuration.resposeHandle) {
                responseObject = configuration.resposeHandle(dataTask, responseObject);
            }
            successed(dataTask, responseObject);
        }
    }];
    [dataTask resume];
    return dataTask;
}

/**
 上传资源
 
 @param URLString URLString 请求的URL地址,不包含baseUrl
 @param parameters 请求参数
 @param block 将要上传的资源回调
 @param configurationHandler 将默认的配置给到外面,外面可能需要特殊处理,可以修改baseUrl等信息
 @param progress 上传资源进度
 @param successed 请求成功
 @param failured 请求失败
 @return task
 */
- (NSURLSessionTask *_Nullable)uploadWithURLString:(NSString *_Nullable)URLString
                                        parameters:(NSDictionary *_Nullable)parameters
                         constructingBodyWithBlock:(void (^_Nullable)(id <AFMultipartFormData> _Nullable formData))block
                              configurationHandler:(void (^_Nullable)(HZNetworkConfig * _Nullable configuration))configurationHandler
                                          progress:(HZRequestManagerProgress _Nullable)progress
                                           successed:(HZRequestManagerSuccess _Nullable )successed
                                           failured:(HZRequestManagerFailure _Nullable )failured {
    HZNetworkConfig *configuration = [self disposeConfiguration:configurationHandler];
    parameters = [self disposeRequestParameters:parameters];
    NSString *requestUrl = [NSString stringWithFormat:@"%@/%@", configuration.baseURL, URLString];
    __weak typeof(self) weakself = self;
    
    NSURLSessionDataTask *dataTask = [self.requestManager POST:requestUrl
                                                    parameters:parameters
                                     constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
                                         block(formData);
                                     } progress:^(NSProgress * _Nonnull uploadProgress) {
                                         progress(uploadProgress);
                                     } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
                                         successed(task, responseObject);
                                     } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
                                         failured(task, error, weakself.networkStatus);
                                     }];
    [dataTask resume];
    return dataTask;
}
/** 取消所有的网络请求 */
- (void)cancelAllRequest {
    [self.requestManager invalidateSessionCancelingTasks:YES];
}

#pragma mark - 内部方法
- (NSDictionary *)disposeRequestParameters:(NSDictionary *)parameters {
    NSMutableDictionary *bodys = [NSMutableDictionary dictionaryWithDictionary:parameters];
    if (self.configuration.builtinBodys.allKeys.count > 0) {
        for (NSString *key in self.configuration.builtinBodys) {
            [bodys setObject:self.configuration.builtinBodys[key] forKey:key];
        }
    }
    return bodys;
}

- (HZNetworkConfig *)disposeConfiguration:(void (^_Nullable)(HZNetworkConfig * _Nullable configuration))configurationHandler {
    //configuration配置
    HZNetworkConfig *configuration = [self.configuration copy];
    if (configurationHandler) {
        configurationHandler(configuration);
    }
    self.requestManager.requestSerializer = configuration.requestSerializer;
    self.requestManager.responseSerializer = configuration.responseSerializer;
    if (configuration.builtinHeaders.allKeys.count > 0) {
        for (NSString *key in configuration.builtinHeaders) {
            [self.requestManager.requestSerializer setValue:configuration.builtinHeaders[key] forHTTPHeaderField:key];
        }
    }
    
    [self.requestManager.requestSerializer willChangeValueForKey:@"timeoutInterval"];
    if (configuration.timeoutInterval > 0) {
        self.requestManager.requestSerializer.timeoutInterval = configuration.timeoutInterval;
    }else {
        self.requestManager.requestSerializer.timeoutInterval = HZRequestTimeoutInterval;
    }
    [self.requestManager.requestSerializer didChangeValueForKey:@"timeoutInterval"];
    return configuration;
}


- (NSString *)serializeParams:(NSDictionary *)params {
    NSMutableArray *parts = [NSMutableArray array];
    [params enumerateKeysAndObjectsUsingBlock:^(id key, id<NSObject> obj, BOOL *stop) {
        NSString *part = [NSString stringWithFormat: @"%@=%@", key, obj];
        [parts addObject: part];
    }];
    if (parts.count > 0) {
        NSString *queryString = [parts componentsJoinedByString:@"&"];
        return queryString ? [NSString stringWithFormat:@"?%@", queryString] : @"";
    }
    return @"";
}

@end

使用

@interface HZLitchNetWork : NSObject
@property (nonatomic, strong) NSString * _Nullable baseURL;
@property (nonatomic, assign) BOOL logOut;

@property (nonatomic, copy) NSString *HostURL;
@property (nonatomic, copy) NSString *HOSTURL;
@property (nonatomic, copy) NSString *IMURL;

+ (instancetype)sharedInstance;

- (NSURLSessionTask *_Nullable)POST:(NSString *)url parameters:(NSDictionary * _Nullable)parameters configurationHandler:(void (^_Nullable)(HZNetworkConfig * _Nullable configuration))configurationHandler cache:(HZRequestManagerCache _Nullable )cache successed:(HZRequestManagerSuccess _Nullable )successed failured:(HZRequestManagerFailure _Nullable )failured;

/**
 上传图片资源
 
 @param url 连接
 @param parameters 参数
 @param block 文件
 @param configurationHandler e配置
 @param successed 成功回调
 @param failured 失败回调
 @return NSURLSessionTask
 */
- (NSURLSessionTask *_Nullable)uploadWithURLString:(NSString *)url
                                        parameters:(NSDictionary * _Nullable)parameters
                         constructingBodyWithBlock:(void (^_Nullable)(id <AFMultipartFormData> _Nullable formData))block
                              configurationHandler:(void (^_Nullable)(HZNetworkConfig * _Nullable configuration))configurationHandler
                                         successed:(HZRequestManagerSuccess _Nullable )successed
                                          failured:(HZRequestManagerFailure _Nullable )failured;
@interface HZLitchNetWork()
@property (nonatomic, strong) HZNetworkManager *requestManager;

@end

@implementation HZLitchNetWork
static HZLitchNetWork *instance;
//初始化方法
- (instancetype)init{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [super init];
        instance.requestManager = [HZNetworkManager sharedInstance];
        [instance initialConfig];
    });
    return instance;
}
//单例方法
+ (instancetype)sharedInstance{
    return [[self alloc] init];
}
//alloc会调用allocWithZone,确保使用同一块内存地址
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [super allocWithZone:zone];
    });
    return instance;
}
//copy的时候会调用copyWithZone
- (id)copyWithZone:(NSZone *)zone{
    return instance;
}
+ (id)copyWithZone:(struct _NSZone *)zone{
    return instance;
}
+ (id)mutableCopyWithZone:(struct _NSZone *)zone{
    return instance;
}
- (id)mutableCopyWithZone:(NSZone *)zone{
    return instance;
}


- (void)initialConfig {
    
    self.requestManager.configuration.baseURL = [self HOSTURL];
    //    self.requestConvertManager.configuration.resultCacheDuration = 1;
    self.requestManager.configuration.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/html", @"text/json", @"text/plain", @"text/javascript", @"text/xml", @"image/*", nil];
    //通过configuration来统一处理输出的数据,比如对token失效处理、对需要重新登录拦截
    self.requestManager.configuration.resposeHandle = ^id (NSURLSessionTask *dataTask, id responseObject) {
        if ([responseObject[@"errcode"] integerValue] == 40002) {

            [[NSNotificationCenter defaultCenter] postNotificationName:ConfigurationResposeHandle object:nil];
        }
        return responseObject;
    };
    
}

- (void)setBaseURL:(NSString *)baseURL {
    _baseURL = baseURL;
    self.requestManager.configuration.baseURL = baseURL;
}


#pragma mark - 缓存管理
- (void)clearRequestCache:(NSString *_Nullable)urlString parameters:(NSDictionary *_Nullable)parameters {
    [HZNetWorkCache removeHttpCacheWithUrl:urlString parameters:parameters];
}

- (void)clearAllCache {
    [HZNetWorkCache removeAllHttpCache];
}


- (NSURLSessionTask *_Nullable)POST:(NSString *)url parameters:(NSDictionary * _Nullable)parameters configurationHandler:(void (^_Nullable)(HZNetworkConfig * _Nullable configuration))configurationHandler cache:(HZRequestManagerCache _Nullable )cache successed:(HZRequestManagerSuccess _Nullable )successed failured:(HZRequestManagerFailure _Nullable )failured {
    
    return [self.requestManager requestMethod:HZRequestMethodPost URLString:url parameters:parameters configurationHandler:^(HZNetworkConfig * _Nullable configuration) {
        NSString *contentStr = [[HeaderModel new] mj_JSONString];
        configuration.builtinHeaders = [NSMutableDictionary dictionary];
        [configuration.builtinHeaders setObject:contentStr forKey:@"App-Common-Params"];
        if (configurationHandler) {
            configurationHandler(configuration);
        }
    } cache:^(id  _Nullable responseObject, NSError *error) {
        cache ? cache(responseObject, error) : nil;
    } successed:^(NSURLSessionTask * _Nullable task, id  _Nullable responseObject) {
        successed ? successed(task, responseObject) : nil;
    } failured:^(NSURLSessionTask * _Nullable task, NSError * _Nullable error, AFNetworkReachabilityStatus netWorkStatus) {
        failured ? failured(task, error, netWorkStatus) : nil;
    }];
}


/**
 上传图片资源

 @param url 连接
 @param parameters 参数
 @param block 文件
 @param configurationHandler e配置
 @param successed 成功回调
 @param failured 失败回调
 @return NSURLSessionTask
 */
- (NSURLSessionTask *_Nullable)uploadWithURLString:(NSString *)url
                                        parameters:(NSDictionary * _Nullable)parameters
                         constructingBodyWithBlock:(void (^_Nullable)(id <AFMultipartFormData> _Nullable formData))block
                              configurationHandler:(void (^_Nullable)(HZNetworkConfig * _Nullable configuration))configurationHandler
                                         successed:(HZRequestManagerSuccess _Nullable )successed
                                          failured:(HZRequestManagerFailure _Nullable )failured {
    
    return [self.requestManager uploadWithURLString:url parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nullable formData) {
        block ? block(formData) : nil;
    } configurationHandler:^(HZNetworkConfig * _Nullable configuration) {
        NSString *contentStr = [[HeaderModel new] mj_JSONString];
        configuration.builtinHeaders = [NSMutableDictionary dictionary];
        [configuration.builtinHeaders setObject:contentStr forKey:@"App-Common-Params"];
        if (configurationHandler) {
            configurationHandler(configuration);
        }
        
    } progress:^(NSProgress * _Nullable progress) {
        
    } successed:^(NSURLSessionTask * _Nullable task, id  _Nullable responseObject) {
        successed ? successed(task, responseObject) : nil;
    } failured:^(NSURLSessionTask * _Nullable task, NSError * _Nullable error, AFNetworkReachabilityStatus netWorkStatus) {
        failured ? failured(task, error, netWorkStatus) : nil;
    }];
}

代码

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,097评论 1 32
  • iOS网络架构讨论梳理整理中。。。 其实如果没有APIManager这一层是没法使用delegate的,毕竟多个单...
    yhtang阅读 5,188评论 1 23
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,957评论 6 13
  • 很小的时候,有一次听到电视里咿咿呀呀唱着的戏曲,总觉得说不出来的别扭,现在想来是我太小,听不懂戏文的含义吧。 ...
    杜小喵阅读 1,382评论 0 1
  • 文/良言 晴寒初入露, 落木动秋岚。 野径牵云石, 山钟锁竹庵。 参差篱菊倚, 寂寞井梧含。 举酒茱萸老, ...
    流觞对月空吟夜阅读 303评论 2 12