2010-02-25 2 views
3

iPhone 응용 프로그램을 쓰고 있습니다. 그 중 하나는 탭 피드이며, 나는 twitter xml을 구문 분석하고 테이블보기 안에 멋지게 넣습니다. 인터넷에 연결되어 있지 않은 경우 마지막으로 인터넷에 연결되어있는 테이블의 캐시 결과를 표시하고 테이블을 업데이트하고 싶습니다. 나는과 같이 그것을 위해 NSURLCache을 사용하고 있습니다 : (. http://www.twitter.com/..)NSURLCache 캐시 응답 문제

NSURLRequest *theRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:xmlLink] 
     cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:60]; 
NSURLCache *sharedCache = [NSURLCache sharedURLCache]; 

NSCachedURLResponse *response = [sharedCache cachedResponseForRequest:theRequest]; 

if (response) { 
    NSLog(@"Got Response"); 
} else { 
    NSLog(@"Didn't got Response"); 
} 
self.objectFeedConnection = [[[NSURLConnection alloc] initWithRequest:theRequest delegate:self startImmediately:YES] autorelease]; 

나는 그것이이 웹 사이트 내가 할 수있는 방문이 처음이기 때문에 NSLog 출력은 "응답을 가지고하지 않았나요"처음 것을 알 수 있습니다 "

- (NSCachedURLResponse *) connection:(NSURLConnection *)connection 
    willCacheResponse:(NSCachedURLResponse *)cachedResponse 
{ 
    NSLog(@"willCache Reponse"); 
    NSCachedURLResponse *newCachedResponse = nil;  
    if ([[[[cachedResponse response] URL] scheme] isEqual:@"http"]) { 
      newCachedResponse = [[[NSCachedURLResponse alloc] 
      initWithResponse:[cachedResponse response] 
      data:[cachedResponse data] 
      userInfo:nil 
      storagePolicy:[cachedResponse storagePolicy]] 
      autorelease]; 
} 
    return newCachedResponse; 
} 

이이 사이트를 방문 두 번째 시간은 내가 명확하게 NSLog 출력을 볼 수 있습니다 또한 내가 initWithRequest이 출시 된 후 지금처럼 호출되는 willCacheResponse 방법을 구현하기 때문에 응답이 캐시되고 있음을 볼 수 Got Response "는 캐시 히트가 있었으므로 willCacheResponse를 의미합니다. 이 아니라면이 다시 호출되지만 이상한 이유로 다시 호출되고 정보를 캐시에서 꺼내지 않고 다시 캐싱하려고 시도합니다.

이 문제의 원인은 무엇입니까?

감사합니다. 내가 제대로 질문을 이해한다면

+0

내가 정책의 모든 종류의 시도를. 기본적으로 NSURLRequestUseProtocolCachePolicy를 사용해야합니다. 인터넷 연결이있을 경우 항상 원격지에서로드하고, 그렇지 않으면 캐시에서로드합니다.하지만 둘 다 나에게 같은 문제가 발생합니다. – djTeller

답변

0

, 그럼 저도 같은 문제를 겪고 그것을 해결하지 : Does NSURLConnection take advantage of NSURLCache?

지금까지 내가 말할 수있는 NSURLConnection은 캐시를 활용하지 않으며, 당신은에 있습니다 네가 원하면 직접해라.

+0

이것은 정확히 내 문제입니다, 그것은 단지 응답 URL을 캐싱하는 것처럼 보입니다. 데이터가 아닙니다. 그래서 그것을 사용하고 싶다면 이미 특정 사이트를 방문했는지 확인할 수 있습니다. 실제로 NSKedArchive를 사용하여 캐시를 구현하기 위해 하루 종일 일했습니다. NSURLCache를 처음에는 캐시 된 표시로 사용합니다. 응답이 없으면 캐시합니다. 응답이 예인 경우 캐시에서 꺼냅니다. 아카이브. 그들은이 주제에 관한 문서를 좀 더 명확하게 만들고 몇 가지 예를 추가해야합니다. – djTeller

2

OP는 더 이상 신경 쓰지 않지만 다른 사람은 이걸 가지고 노는 다른 사람들을 위해 - 응답에서 반환되는 HTTP 헤더를 확인해야합니다. NSURLCache는 캐시에서 반환 된 것을 사용할 수 있는지 결정하기 위해 헤더를 검사합니다. 캐시 제어 : 마지막으로 수정 : Etag입니다 : 등