为 AFNetworking 3.x 实施自定义缓存

Implement custom cache for AFNetworking 3.x

您好,我正在编写 IOS api 以使用 AFNetworking 3.x 从服务器获取数据 3.x 我的服务器不支持缓存。这个这个服务器头

Connection →Keep-Alive
Content-Length →4603
Content-Type →text/html; charset=UTF-8
Date →Wed, 10 Aug 2016 04:03:56 GMT
Keep-Alive →timeout=5, max=100
Server →Apache/2.4.18 (Unix) OpenSSL/1.0.1e-fips PHP/5.4.45
X-Powered-By →PHP/5.4.45

我想构建自定义 API 以启用缓存(例如,请求和响应应该缓存 10 秒,这样如果用户发出相同的请求,就会使用缓存数据。如果缓存过期,应用程序将重新重新下载)

我的AFNetworking单例

#pragma mark - Shared singleton instance

+ (ApiClient *)sharedInstance {
    static ApiClient *sharedInstance = nil;
    static dispatch_once_t oncePredicate;
    dispatch_once(&oncePredicate, ^{
        NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
        sharedInstance = [[self alloc] initWithBaseURL:[NSURL URLWithString:SINGPOST_BASE_URL] sessionConfiguration:sessionConfiguration];

    return sharedInstance;
}

- (id)initWithBaseURL:(NSURL *)url
{
    if ((self = [super initWithBaseURL:url])) {
        self.requestSerializer = [AFHTTPRequestSerializer serializer];
    }
    return self;
}

我的JSON请求

- (void)sendJSONRequest:(NSMutableURLRequest *)request
                success:(void (^)(NSURLResponse *response, id responseObject))success
                failure:(void (^)(NSError *error))failure {

    self.responseSerializer.acceptableContentTypes = [AFHTTPResponseSerializer serializer].acceptableContentTypes;
    self.requestSerializer.timeoutInterval = 5;
    self.requestSerializer.cachePolicy = NSURLRequestReturnCacheDataElseLoad;

        [self setDataTaskWillCacheResponseBlock:^NSCachedURLResponse * _Nonnull(NSURLSession * _Nonnull session, NSURLSessionDataTask * _Nonnull dataTask, NSCachedURLResponse * _Nonnull proposedResponse) {
            return [[NSCachedURLResponse alloc] initWithResponse:proposedResponse.response
                                                            data:proposedResponse.data
                                                        userInfo:proposedResponse.userInfo
                                                   storagePolicy:NSURLCacheStorageAllowed];
        }];

    NSURLSessionDataTask *dataTask = [ApiClient.sharedInstance dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
        if (error) {
            NSLog(@"Error URL: %@",request.URL.absoluteString);
            NSLog(@"Error: %@", error);
            failure(error);
        } else {
            NSDictionary *jsonDict  = (NSDictionary *) responseObject;
            success(response,jsonDict);
            NSLog(@"Success URL: %@",request.URL.absoluteString);
            NSLog(@"Success %@",jsonDict);
        }
    }];
    [dataTask resume];

}

如何修改以下代码以启用缓存请求和响应(我希望响应保持 10 秒)(如果没有互联网连接,则为 1 天)非常感谢您的帮助。谢谢!

[self setDataTaskWillCacheResponseBlock:^NSCachedURLResponse * _Nonnull(NSURLSession * _Nonnull session, NSURLSessionDataTask * _Nonnull dataTask, NSCachedURLResponse * _Nonnull proposedResponse) {
            return [[NSCachedURLResponse alloc] initWithResponse:proposedResponse.response
                                                            data:proposedResponse.data
                                                        userInfo:proposedResponse.userInfo
                                                   storagePolicy:NSURLCacheStorageAllowed];
        }];

而不是

            return [[NSCachedURLResponse alloc] initWithResponse:proposedResponse.response

            NSMutableDictionary *dictionary = [proposedResponse.response.allHeaderFields mutableCopy];
            dictionary[@"Cache-Control" = ...
            NSHTTPURLResponse *modifiedResponse =
              [[NSHTTPURLResponse alloc initWithURL:proposedResponse.response.URL
                                         statusCode:proposedResponse.response.statusCode
                                        HTTPVersion:@"HTTP/1.1"
                                       headerFields:modifiedHeaders];

            [modifiedResponse 
            return [[NSCachedURLResponse alloc] initWithResponse:modifiedResponse

请注意,无法从原始请求中检索 HTTP 版本。我很确定我为此提交了一个错误。我也很确定它对任何东西都没有任何影响,而且我认为它甚至不会存储在底层对象中,所以它可能无关紧要。