AFNetworking 3.x: Как узнать, получен ли ответ из кеша или нет?

Вопрос AFNetworking: как узнать, использует ли ответ кеш или нет? 304 или 200 хорошо ответили на AFNetworking 2.x. Но как сделать то же самое в 3.x?

Очень полезно знать, были ли ресурсы возвращены из кеша или из сети во время отладки.


person fatuhoku    schedule 10.02.2016    source источник
comment
Я знаю, что было слишком поздно, чтобы ответить. Я сталкиваюсь с той же проблемой и получил ответ после большого анализа. Надеюсь, это поможет другим.   -  person kaushal    schedule 04.05.2016


Ответы (1)


Вы можете использовать тот же подход с AFNetworking3.0.

 BOOL __block responseFromCache = YES; // yes by default
 [self setDataTaskWillCacheResponseBlock:^NSCachedURLResponse * _Nonnull(NSURLSession * _Nonnull session, NSURLSessionDataTask * _Nonnull dataTask, NSCachedURLResponse * _Nonnull proposedResponse) {
    responseFromCache = NO;
    NSLog(@"Sending back to cache response");
    NSCachedURLResponse * responseCached;
    NSHTTPURLResponse * httpResponse = (NSHTTPURLResponse *)      [proposedResponse response];

    if (dataTask.originalRequest.cachePolicy == NSURLRequestUseProtocolCachePolicy) {
        NSDictionary *headers = httpResponse.allHeaderFields;
        NSString * cacheControl = [headers valueForKey:@"Cache-Control"];
        NSString * expires = [headers valueForKey:@"Expires"];
        if (cacheControl == nil && expires == nil) {
            NSLog(@"Server does not provide info for cache policy");
            responseCached = [[NSCachedURLResponse alloc] initWithResponse:dataTask.response
                                                                      data:proposedResponse.data
                                                                  userInfo:@{ @"response" : dataTask.response, @"proposed" : proposedResponse.data }
                                                             storagePolicy:NSURLCacheStorageAllowed];
        }
    }
    return responseCached;
}];

[self wb_GET:url parameters:nil headerFields:additionalHeadersDict success:^(NSURLSessionDataTask *task, id responseObject) {

        if (responseFromCache) {
            // response was returned from cache
            NSLog(@"RESPONSE FROM CACHE: %@", responseObject);
        }

    handler(responseObject, nil);

} failure:^(NSURLSessionDataTask *task, NSError *error) {
    handler(nil, error);
}];

Кроме того, вы также можете реализовать приведенный ниже метод делегата в свой подкласс AFHTTPSessionManager.

  - (void)baseSuccessWithResponseObject:(id)responseObject sessionTask: (NSURLSessionDataTask *) task validationHandler:(void(^)(id responseObject, NSError *error))handler{}
person kaushal    schedule 04.05.2016