2009-12-08 1 views
11

캐싱을 활용하여 URL 로딩 프레임 워크를 사용하여 URL을로드하는 방법을 파악하려고합니다.NSURLConnection은 NSURLCache를 활용합니까?

NSURLConnections를 사용하고 있으며 NSURLRequests를 제공하고 있습니다. NSURLRequestReturnCacheDataElseLoad 요청에 대한 cachePolicy를 설정했습니다. 처음 요청을로드하면 자동으로 캐시에 저장됩니다 ([NSURLCache sharedCache] 있음). 그러나 다음에 동일한 요청을로드 할 때 NSURLConnection은 캐시에있는 내용을 무시하고 데이터를 다시로드하는 것으로 보입니다.

수동으로 캐시 조회를 구현하고 캐시 된 데이터를 반환하겠습니까? NSURLConnection은 이것을하지 않습니까? 아니면 프레임 워크에서 캐시를 원활하게 사용할 수있는 방법이 있습니까?

UPDATE :

  • NSURLRequestReturnCacheDataElseLoad 대신
  • NSURLRequestUseProtocolCachePolicy의 다시 사용하여 요청 객체를 대신 새
  • +[NSURLConnection sendSynchronousRequest:returningResponse:error:] 사용을 요청 캐시 정책을 설정 :는 성공없이 다음 시도 비동기 적으로로드하는 대신
+2

동일한 NSURLRequest 객체를 제공합니까? NSURLCache는 NSURLCache가 특정 응답 데이터에 특정 NSURLRequest 객체를 매핑하여 작동하므로 동일한 URL에 대한 요청을하더라도 여전히 캐시 누락이 발생할 수 있습니다. – ImHuntingWabbits

+0

아니요, 새로운 NSURLRequest를 만들고 있습니다. 그러나 새 요청 객체로 [[NSURLCache sharedURLCache] cachedResponseForRequest :]'를 수행하면 캐시 된 응답이 있습니다. 따라서 NSURLCache는 요청이 동일하다는 것을 어떻게 든 알고 있습니다. – jasoncrawford

+0

추 신 : NSURLRequest 객체 재사용을 시도했습니다. 차이를 만들지 않습니다. – jasoncrawford

답변

0

ind 적어도 일부 상황에서는 자동으로 NSURLCache를 사용합니다. 물론 다음과 같은 코드를 수행합니다

편집 - 작품을 OS X 10.6 코코아 응용 프로그램에서가 아니라 아이폰 (오독 질문)

#import <Foundation/Foundation.h> 

int main (int argc, const char * argv[]) { 

    // run request with default cache policy 
NSMutableURLRequest *req=[NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://en.wikipedia.org/"]]; 
NSData *data=[NSURLConnection sendSynchronousRequest:req returningResponse:nil error:nil]; 
NSLog(@"Received %d bytes", [data length]); 

sleep(10); 

    // now run it asking it to use the cache 
[req setCachePolicy:NSURLRequestReturnCacheDataElseLoad]; 
data=[NSURLConnection sendSynchronousRequest:req returningResponse:nil error:nil]; 
NSLog(@"Received %d bytes", [data length]); 

    return 0; 
} 
+0

흥미 롭습니다. 감사합니다. 하지만 비동기 요청을 수행하고 있습니다. 중요하지 않은지 확실하지 않습니다. – jasoncrawford

+0

OK, 실제로 이것을 시도한 결과 나에게 효과가 없습니다. 두 번째 요청은 여전히 ​​수백 밀리 초가 걸리며 캐시 정책 인 NSURLRequestReturnCacheDataDontLoad를 사용하면 0 바이트를 반환합니다. 또한'[[NSURLCache sharedURLCache] cachedResponseForRequest : req]'를 사용하여 캐시를 직접 쿼리하면 nil을 반환합니다. 여기에는 저를 위해 캐싱이 없습니다. 저는 Snow Leopard에서 OS 3.0 (또한 3.1.2 시도)을 시뮬레이트하는 iPhone 시뮬레이터에서 실행 중입니다. – jasoncrawford

+1

맞아, 뭔가 관련이 있을지도 모르겠다. OS X에서 바로 실행 중이다. 아이폰 태그를 발견하지 못했다. 미안하다. –

0

당신이 connection:willCacheResponse: 방법 덤비는 시도? URL Loading System documentation에 따르면 "기본적으로 연결에 대한 데이터는 요청을 처리하는 NSURLProtocol 하위 클래스가 제공하는 지원에 따라 캐시됩니다 .NSURLConnection DelegationDelegate는 connection : willCacheResponse :를 구현하여 해당 동작을 더 자세히 정의 할 수 있습니다.

+1

그래, 나는'connection : willCacheResponse :'구현을 시도했다. - 도움이되지 않는다. 그 방법은 호출되고, - 여기 키커가 있습니다 - 응답은 확실히 캐시에서 끝납니다. 첫 번째 요청 후'[[NSURLCache sharedCache] cachedResponseForRequest : request]'는 캐시 된 응답을 반환합니다. 하지만 같은 요청으로 NSURLConnection을 초기화하면 캐시를 치는 것이 아니라 새로 가져옵니다. – jasoncrawford

+0

과거에는 캐시에서 실제로 엿보고 도움이되었습니다. 특정 상황에서 가능한 경우 비동기 적으로로드하는 대신 메서드가 즉시 반환되기를 원했지만. –

6

참고 아이폰 OS 5 년 이후 모두 메모리와 디스크 용량이 sharedURLCache을 제공합니다.

// A 10MB cache. This a good avatar-image-cache size but might be too 
// large for your app's memory requirements. YMMV. 
[[NSURLCache sharedURLCache] setMemoryCapacity:1024*1024*10]; 

기본 아이폰 NSURLCache 인스턴스가 디스크에 지금까지 캐시에 거부 : 당신이 NSURLCache 일부 용량을 설정하지 않는 한

아무것도 캐시하지 않습니다. 이 동작이 필요한 경우 NSURLCache의 하위 클래스를 만들고 자신의 디스크 캐시를 구현해야합니다. 나는 GitHub에서 수많은 디스크 캐시 예제를 발견했지만, 그 중 아무도 완전히 필요한 "prune"단계를 만족스럽게 수행하지는 못합니다.

+1

[[NSURLCache sharedURLCache] setMemoryCapacity : 1024 * 1024 * 10]이 작동하지만 AppDelegate에서 한 번 호출했을 때 캐시 동작이 앱 실행 사이에 완전히 임의적 이었기 때문에 요청할 때마다 호출해야합니다 (언젠가 언젠가 그것은, 때때로 작동하지 않았다). –

+0

명시 적으로 캐시를 설정하지 않아도 NSURLCache는 여전히 db 파일을 만들고 콘텐츠를 저장합니다! – Abhinit

+1

@Abhinit 예, 대답은 iOS 5 이전입니다. 그 이후로 캐시는 사용 중지하지 않는 한 항상 설정됩니다. – mxcl