2014-09-21 2 views
14

간단히 말해서, iOS 8에서 앱이 작동하는 방식을 확인하기 위해 Xcode 6으로 업데이트했습니다. 그래야만 캐시를 사용하지 않는 것으로 나타났습니다. 나는 AFNetworking이 같은 cachePolicy 설정을 사용하고 있습니다 :iOS 8이 NSURLCache를 중단 했습니까?

sessionManager.requestSerializer.cachePolicy = NSURLRequestReturnCacheDataElseLoad; 

나는 아직도 내가 동일한 코드를 테스트하는 아이폰 OS 7 장치가 예상대로 거기 작동합니다.

누구에게도 해결책이 있습니까? 아니면 Apple에서 고칠 때까지 기다릴 필요가 있습니까?

+0

NSURLSession과 매우 유사한 것을 발견했습니다. NSURLConnection NSURLCache 여전히 올바르게 작동하는 것 같아요. –

+0

방금 ​​사용자 지정 NSURLCache 하위 클래스 (storeCachedResponse : forRequest :가 호출되고 있지만 cachedResponseForRequest :가 호출되지 않음)와 동일한 (AFNetworking2 포함) 것으로 나타났습니다. –

답변

12

iOS 8.0이 HTTP 응답 데이터를 캐시 할 수있는 NSURLSession의 기능을 깨뜨린 것이 거의 확실합니다. 나는이 문제에 관해 애플과 레이더를 열었다.

여기에 내가 이것을 증명하기 위해 쓴 몇 가지 예제 코드입니다 :

NSURLSession *session = [NSURLSession sharedSession]; 
NSURLCache *URLCache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024 
                diskCapacity:32 * 1024 * 1024 
                 diskPath:nil]; 
[NSURLCache setSharedURLCache:URLCache]; 

dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); 
NSURL *URL = [NSURL URLWithString:@"http://i.imgur.com/b5pyONe.jpg"]; 
NSURLRequest *request = [NSURLRequest requestWithURL:URL 
             cachePolicy:NSURLRequestReturnCacheDataElseLoad 
            timeoutInterval:5]; 
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
    if (error) { 
     NSLog(@"Error occurred"); 
    } else { 
     NSLog(@"Fetched resource!"); 
    } 
    dispatch_semaphore_signal(semaphore); 
}]; 
[task resume]; 

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); 

request = [NSURLRequest requestWithURL:URL 
          cachePolicy:NSURLRequestReturnCacheDataDontLoad 
         timeoutInterval:5]; 
task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
    if (error) { 
     NSLog(@"Something bad happened: %@", error); 
    } else { 
     NSLog(@"Fetched resource!"); 
    } 
}]; 
[task resume]; 

도 만들어 자신의 NSURLSession -이 문제를 해결하지 않을 것이다 - 당신이 자신을 만들 NSURLCache이있는 NSURLSessionConfiguration와. 현재로서는 캐싱 응답이 잘못 필요할 경우 NSURLConnection을 사용해야합니다.

+0

그건 내가 생각한거야. 나는 애플이 최근 얼마나 많은 문제를 겪었는지 놀라 울 뿐이다. – Pahnev

+1

Richard, NSURLCache에 대한 사과의 답변이 있습니까? 내 응용 프로그램에는 캐시가 필요하지만 iOS 8에서는 깨졌습니다. –

+0

@JohnKakon 아직 Apple에서 아무 것도 듣지 못했습니다. Xcode 6.1 GM으로 테스트 했는데도 여전히 문제가 있습니다. 캐싱이 필요하면 NSURLConnection을 사용해야합니다. –

5

NSURLConnection이 제대로 작동하지 않습니다. 응답을 올바르게 저장하지만 iOS 8.0에서는 never purges the cache (diskCapacity가 무시 됨)이므로 캐시가 수동으로 지워지더라도 캐시는 grow without limit이됩니다. fixed in iOS 8.1이지만 removeCachedResponseForRequest : 여전히 작동하지 않습니다.

또한 5MB보다 작은 캐시 크기를 지정하면 아무 것도 캐시하지 않습니다.

1

NSURLCacheNSURLSession은 모두 버그입니다. 요청으로 NSURLRequestReturnCacheDataElseLoad을 설정해도 iOS가 서버에서 파일을 다시로드하려고 시도 할 수 있습니다. 예를 들어 캐시 된 응답의 헤더가 Vary 일 때 발생합니다. 또한 캐시 된 객체를 구별하기 위해 그 방법을 요청에서

- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request 

사용 User-Agent 헤더를 주목하시기 바랍니다. User-Agent이 다르기 때문에 iOS는 NSURLSession 및 UIWebView로 액세스하면 동일한 파일을 두 번 저장합니다.

관련 문제