AFNetworking:如何知道响应是否正在使用缓存?304或200

Vas*_*ily 19 iphone asihttprequest http-status-code-304 ios afnetworking

我找不到任何问题的答案,可能是我错过了什么......

当我要求提供网址时,我需要知道响应是来自缓存还是来自网络.

状态代码是304还是200?(但AFNetworking总是回应200)

随着ASIHTTPRequest我用来检查" didUseCachedResponse"从ASIHTTPRequest,这是完美的.

Dar*_*ski 24

我想我找到了一个解决方案来确定是否使用AFNetworking 2.0从缓存返回响应.我发现每次从服务器(状态200,而不是304)返回一个新的响应时cacheResponseBlock,AFHTTPRequestOperation都会调用它的属性.NSCachedURLResponse如果响应应该缓存,则块应返回,否则应返回nil.这样您就可以过滤响应并仅缓存其中一些响应.在这种情况下,我正在缓存来自服务器的所有响应.诀窍是,当服务器发送304并从缓存加载响应时,将不会调用此块.所以,这是我正在使用的代码:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

BOOL __block responseFromCache = YES; // yes by default

void (^requestSuccessBlock)(AFHTTPRequestOperation *operation, id responseObject) = ^(AFHTTPRequestOperation *operation, id responseObject) {
    if (responseFromCache) {
        // response was returned from cache
        NSLog(@"RESPONSE FROM CACHE: %@", responseObject);
    }
    else {
        // response was returned from the server, not from cache
        NSLog(@"RESPONSE: %@", responseObject);
    }
};

void (^requestFailureBlock)(AFHTTPRequestOperation *operation, NSError *error) = ^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"ERROR: %@", error);
};

AFHTTPRequestOperation *operation = [manager GET:@"http://example.com/"
                                      parameters:nil
                                         success:requestSuccessBlock
                                         failure:requestFailureBlock];

[operation setCacheResponseBlock:^NSCachedURLResponse *(NSURLConnection *connection, NSCachedURLResponse *cachedResponse) {
    // this will be called whenever server returns status code 200, not 304
    responseFromCache = NO;
    return cachedResponse;
}];
Run Code Online (Sandbox Code Playgroud)

这个解决方案对我有用,到目前为止我还没有发现任何问题.但是,如果您对我的解决方案有更好的想法或反对意见,请随时发表评论!

  • 您必须要小心,因为当服务器没有或不正确的缓存响应头时,不会调用此块.如果是这种情况,您始终会认为AFNetworking正在从缓存加载,但实际上它是从服务器加载的.还有一些其他情况下不会调用此方法 - 请参阅apple doc:https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSURLSessionDataDelegate_protocol/Reference/Reference.html#//apple_ref/occ/intfm/NSURLSessionDataDelegate/URLSession:dataTask:willCacheResponse:completionHandler: (4认同)
  • 对于`AFURLSessionManager`,它是`dataTaskWillCacheResponse` (2认同)