2012-06-28 3 views
8

내 앱이로드되면 JSON 표현 99 개의 개체가 풀다운됩니다.AFNetworking의 UIImageView 카테고리에 대한 이미지 미리 캐시

각 개체에는 'image_url'필드가 있으며 AFnetworking의 setImageWithURLRequest으로 전달됩니다.

내 이미지가 tableView에로드되어 결과적으로 처음 몇 개의 셀만 이미지를 요청합니다. 이후 이미지 요청이 내려지기 전까지는 스크롤 다운하지 않습니다.

일단 초기 데이터 세트를 가져 오면 처음에는 보이지 않는 95 개 정도의 개체를 다운로드하고 나가는 백그라운드 프로세스를 시작할 수 있고 그런 식으로 캐시 할 수 있기를 바랍니다. setImageWithURLRequest이 호출되면 캐시 된 이미지가 이미 생성됩니다.

AFImageCache는 비공개이지만 가능한지 확실하지 않습니다. NSURLCache를 사용하여 캐시 할 수 있다는 것을 알고 있지만 두 개의 격리 된 캐시가 있고 이상적인 것도 아닙니다.

AFNetworking의 UIImageView 카테고리를 사용하지 않는 유일한 방법은 무엇입니까?

iOS Caching images with AFImageCache doesn't seem to work 다음
How to configure the cache when using AFNetworking's setImageWithURL

+0

램에 95 개의 이미지를 캐싱하면 램이 많이 걸릴 것입니다. 이렇게하면 기본 제공 캐시를 사용하지 말고 디스크 캐시를 캐시 디렉토리에 구축하십시오. –

+0

나는 정확히 같은 문제가있다. 디스크에 이미지를 캐싱 중입니다. 그러나 캐시에서로드하려고 할 때 가끔은 찾을 수 없습니다. 나는 질문을 질문했다. http://stackoverflow.com/questions/12882639/how-should-i-pre-load-all-images-and-cache-them-using-afnetworking – Burak

답변

24

하십시오, 이 작업을 수행하지 마십시오.

나는 이것을 거의 확실하게 불필요하다고 말한다.

사실상 결코 볼 수없는 이미지를 다운로드하라는 압력이 커지기 때문에 원하는 효과와 반대가 될 수 있습니다.

캐시는 매우 중요한 이유가 있습니다. 스크롤보기에 대한 후속 요청의 속도를 높이기 위해 캐시가 비공개입니다.요청한대로 테이블보기에서 이미지를 다운로드하면됩니다. 다운로드하려는 이미지의 크기를 최적화 할 수 있습니다 (올바른 이미지 크기를 유지하고 지능적으로 압축).

+4

다음 3 또는 4 개의 이미지 만 미리로드하려면 어떻게해야합니까? –

3

는 해결책 - 일부 UIImageView 객체를 생성 (그러나 파단으로 추가하지 않습니다)를를 가져 AFNetworking의 UIImageView에 범주를 사용하여 다음과 :

이 대답은 나를 이렇게 생각하게 내부 캐시를 채 웁니다.

샘플 코드 :

당신은 아마 Fully-Loaded

유지 캐시 이미지를 다운로드하고 URL을 따라 파일 이름에 저장하는 것입니다 간단한 자기를 고려할

NSArray *strings = [NSArray arrayWithObjects: 
        @"http://i.imgur.com/IpQzE.png", 
        @"http://i.imgur.com/sDnLs.jpg", 
        nil]; 

for (NSString *string in strings) { 
    UIImageView *imageView = [[[UIImageView alloc] init] autorelease]; 
    [imageView setImageWithURL:[NSURL URLWithString:string]]; 
} 
+0

흥미 롭다. 나는 실제로 같은 생각을 가지고 있었지만, 내가 만들고있는 모든 UIImageViews의 추가 오버 헤드에 대해 확신하지 못했습니다. 그게 내가 걱정할 필요가있는 것이 아닌가? 나는 100-500 이미지로 이것을 할 것입니다. – djibouti33

+0

UIImage 객체의 메모리 사용량이 UIImageViews의 메모리 사용량보다 훨씬 많습니다 (특히 서브 뷰로 추가되지 않는 경우). 어떤 전략을 사용하든 결국 실제 하드웨어에서 Instruments의 성능을 면밀히 점검해야합니다. 많은 이미지를 다운로드하는 메모리 경고가 발생하여 이미지 캐시가 지워집니다 (NSCache 문서 확인) –

1

.

URL에서 이미지를로드하려면 하드 디스크를 먼저 읽으십시오. nil이 반환되면 이미지 다운로더를 사용하십시오.

이미지 캐시를 지우는 것을 잊지 마십시오.

5

당신의 목적을 달성하기 위해 UIImageView를 만들지는 않을 것입니다. 정말 비효율적 인 접근 방법이 될 것입니다.

UIImageView+AFNetworking.h에 고유 한 방법을 추가하여이 기능을 사용할 수 있습니다. 나는 이것이 가장 좋은 접근 방법이 될 것 같지 않다. 검증되지 않은 예는 다음과 같습니다

+ (void) cacheImageWithURL:(NSURL *)url 
{ 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30.0]; 
    [request setHTTPShouldHandleCookies:NO]; 
    [request setHTTPShouldUsePipelining:YES]; 

    AFImageRequestOperation *requestOperation = [[[AFImageRequestOperation alloc] initWithRequest:request] autorelease]; 
    [requestOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
     [[[self class] af_sharedImageCache] cacheImage:responseObject forRequest:request]; 
    } 
    failure:^(AFHTTPRequestOperation *operation, NSError *error) {}]; 
} 
관련 문제