2012-11-28 1 views
1

MKNetworkKit 캐싱에서 실제로 이상한 문제에 직면하고 있습니다. 간단한 단어의 문제는 "그것은 작동하지 않습니다"..!MKNetworkKit 캐싱이 작동하지 않습니다.

문제가있는 간단한 테스트 프로젝트를 만들었습니다. 프로젝트는 아무 일도하지 않지만 도시 이름에 대한 주소 나 정보를 가져 오는 간단한 GET 요청을 http://where.yahooapis.com /에 보내면됩니다. 응답은 처음 실행될 때 캐시되어야하고, 완료 핸들러는 두 번 호출됩니다 (캐시 된 응답과 페치 된 응답으로 다시 한 번). 아래 볼 수 있듯이, 당신 두 번째 시간 동안 전화를 걸 경우 MKNetworkKit가 캐시 된 데이터와 같은 완료 핸들러를 호출 http://blog.mugunthkumar.com/coding/ios-tutorial-image-cache-and-loading-thumbnails-using-mknetworkkit/

에서 촬영된다. 네트워크 연결 이 올 바르면 MKNetworkKit은 완료 처리기를 두 번 호출합니다. 먼저 과 캐시 된 데이터를 다시 가져온 후 서버에서 최신 데이터를 가져온 후 다시 시도하십시오.

글쎄, 이상한 일은, 내가 캐시하지 않았어, 다시 응용 프로그램을 실행, 그것은 갑자기 캐싱을 시작한 후 캐시를 다시하지 못했습니다. 난 애플 리케이션을 삭제하고 다시 실행, 캐시 임의의 실행 및 문제가 반복 될 때까지 작동하지 않을거야 ..!

참고로 GIT에서 다운로드 한 최신 MKNetworkkit을 사용했습니다.

내 코드에 문제가 있는지, 아니면 MKNetworkKit 자체의 버그인지 확실하지 않습니다. 코드를 살펴보고이 문제를 일으키는 MKNetworkKit이 있는지 알려 주시기 바랍니다. 여기

미리 샘플 프로젝트 [https://www.box.com/s/tsfw3z0avpti051xbyhv] 4

감사를 다운로드하는 링크이다.

답변

5

마지막으로, 알아낼 수 있습니다 ..! 그래서 여기

MKNetworkKit 캐싱 슈퍼 경량이며, 그것은 NSMutableDictionary에 응답을 캐시, 캐시가 진행되는 동안이다. 그게 높은 메모리를 유도하지 않습니다 사용 하시겠습니까? 예. 물론, MKNetworkKit은 영리합니다. UIApplicationDidReceiveMemoryWarningNotification을 확인하고 사전을 디스크로 플러시합니다. 다음에 캐시 된 URL에 요청하면 캐시 된 데이터가 다시 메모리로 이동됩니다. 따라서 실제로는 메모리 캐시 및 디스크 캐시가 있으며 가장 최근에 사용 된 알고리즘을 사용하여 항목을 디스크로 플러시합니다. MKNetworkEngine 클래스에는 캐시 비용을 제어하기 위해 무시할 수있는 메서드가 있습니다.

그래서 내가 처음으로 앱을 실행했을 때 응답이 "디스크"가 아닌 "메모리"에 캐싱되었습니다. 애플 리케이션을 감기 시작했을 때 이전에 캐싱 된 응답은 "메모리"에서 "디스크"로 전송되지 않았습니다. (그 이유는 응용 프로그램의 캐시 디렉토리에 캐시 된 파일조차도 없었기 때문입니다!) 따라서 successBlock은 캐시 된 응답과 함께 두 번 호출되지 않았습니다.

이 문제를 극복하려면 코드 한 줄만 사용하면됩니다.

- (int) cacheMemoryCost 
{ 
    return 0; 
}