2013-11-23 2 views
17

를 캐시하지 않습니다AFNetworking는 - 내가 서버에서 간단한 JSON 피드를 끌어이 코드를 사용하고 응답

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
    manager.responseSerializer = [AFJSONResponseSerializer serializer]; 

[manager GET:kDataUrl parameters:nil 
    success:^(AFHTTPRequestOperation *operation, id responseObject) { 
     NSLog(@"response: %@", responseObject); 
    } 
    failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     NSLog(@"JSON DataError: %@", error); 
    }]; 

의미가 있습니다. 그러나 kDataUrl에서 JSON 파일을 변경하고 브라우저에서 변경되었는지 확인한 후 앱을 다시 실행할 때 이전 응답이 계속 표시됩니다.

AFNetworking이 이전 응답을 캐싱하는 것으로 보입니다. 나는이 행동을 원하지 않는다. 현재 피드를 다운로드하고 싶습니다. 캐싱을 끄기 위해 설정해야하는 설정이나 매개 변수가 있습니까?

+0

해결 했습니까? AFHTTPRequestOperationManager에서 캐시 정책을 설정할 항목을 찾을 수 없습니다. – laucel

+0

이 블로그 게시물 - AFImageCache 및 NSURLCache의 AFNetworking에서 캐싱을 다루고 있습니다. 아마 당신은 독감을 앓고있는 것을 발견 할 것입니다 : http://blog.originate.com/blog/2014/02/20/afimagecache-vs-nsurlcache/ – vfxdrummer

+0

이렇게 해보십시오 : http://stackoverflow.com/questions/33767908/ volunteermatch-api-objective-c/33886449 # 33886449 – Vvk

답변

55

하는 긴 이야기를 짧게 확인, 당신의 AFNetworking 관리자를 정의

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
[manager.requestSerializer setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData]; 

을 즐기십시오!

+1

AFNetworking에 setCachePolicy라는 메서드가 없습니다. 제발 좀 더 분명히 해줄 수 있니? –

+2

실제로이 솔루션이 작동하고 있습니다. – OhadM

+2

새로운 AFNetworking 라이브러리 버전을 사용하면 세션 구성 객체를 url로 설정할 수 있습니다. 'NSURLSessionConfiguration * 설정 = [NSURLSessionConfiguration defaultSessionConfiguration]; configuration.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData; – dishan

12

발생한 문제는 URL 캐시의 영향입니다 (NSURLCache 참조).

요청의 캐싱 동작은 NSMutableURLRequest 개체에 대한 "캐시 정책"을 설정하여 정의 할 수 있습니다 예 :

NSMutableURLRequest* request = ...; 
[request setCachePolicy: myCachePolicy]; 

기본 캐싱 동작 (NSURLRequestUseProtocolCachePolicy) 인 현재의 프로토콜에 적합 HTTP. 그리고 HTTP 프로토콜의 경우 GET 요청은 기본적으로 캐시됩니다!

그리고 AFNetworking은 요청의 기본 동작을 변경하지 않습니다!

지금, 당신은 예를 들어, 다른 캐시 정책을 설정할 수 있습니다 : NSURLRequestReloadIgnoringLocalCacheData

는 URL 부하에 대한 데이터가 원래 소스에서로드되도록 지정합니다. URL로드 요청을 충족시키기 위해 기존의 캐시 데이터를 사용해서는 안됩니다.

이 당신이 달성 할 가능성이 원하는 동작입니다 :

[request setCachePolicy: NSURLRequestReloadIgnoringLocalCacheData]; 

문제를 여기 IS, 슈퍼 "편리한"API는 요청의 URL 캐시 동작을 구성하는 방법을 제공하지 않습니다 . 사용 된 요청에 전혀 액세스 할 수 없습니다.

따라서 생성 된 NSMutableURLRequest 개체에 대한 제어 권한이있는 하위 수준의 API를 사용하고 그에 따라 캐시 정책을 설정하는 것이 좋습니다.

0

나는 그것에 대해 기분이 좋지 않지만 여기서는 어떤 효과가있는가입니다. AppDelegate에 didFinishLaunchingWithOptions에서 :

NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 
                  diskCapacity:0 
                   diskPath:nil]; 
    [NSURLCache setSharedURLCache:sharedCache]; 
1

그냥 수행

manager.requestSerializer.cachePolicy = NSURLRequestCachePolicyReturnCacheDataElseLoad 
0

스위프트의 poeple AFNetworking 3

let manager = AFHTTPSessionManager() 
manager.requestSerializer.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData 
0

의 경우 :

NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration]; 
sessionConfiguration.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData; 

AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:baseURL 
                 sessionConfiguration:sessionConfiguration]; 
1

이 URL의 끝에 약간의 쓰레기를 추가하려고 (예를 들어, 타임 스탬프)

kDataUrl = [NSString stringWithFormat:@"%@?%f", kDataUrl, [NSDate timeIntervalSinceReferenceDate]]; 

이 경우 항상 새로운 데이터를 요청하게됩니다.

0
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
[manager.requestSerializer setValue:@"no-store" forHTTPHeaderField:@"Cache-Control"]; 
[manager.requestSerializer setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData]; 

는 서버가 올바르게 구현 가정, 요청에 Cache-Control:no-store 헤더를 추가)) 나를 위해 작동 는 같은 헤더 따라서이 헤더가 포함 된 요청에 대한 NSURLCache 디스크 캐시를 비활성화와 응답을 반환합니다.