我找不到我的问题的答案,可能是我错过了一些事情...

当我请求一个URL时,我需要知道响应是来自缓存还是来自网络。

状态码是304还是200? (但AFNetworking始终响应200)

使用ASIHTTPRequest,我曾经从didUseCachedResponse中检查“ASIHTTPRequest”,这是完美的。

最佳答案

我想我找到了一种确定是否从缓存返回响应或不使用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;
}];

该解决方案对我有用,到目前为止,我还没有发现任何问题。但是,如果您有更好的主意或对我的解决方案有异议,请随时发表评论!

关于iphone - AFNetworking : How to know if response is using cache or not ? 304或200,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12180727/

10-10 21:10