2012-06-28 33 views
8

當我的應用程序加載時,我拉下了99個對象的JSON表示。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的類別,以獲取圖像並填充其內部緩存。

示例代碼:

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

有趣的問題。我實際上有同樣的想法,但不知道我將創建的所有UIImageView的額外開銷。這不是我需要擔心的事嗎?我會用100-500張圖片做這個。 – djibouti33

+0

UIImage對象的內存使用量將遠遠超過UIImageViews(尤其是如果它們從未作爲子視圖添加的話)。無論您最終使用哪種策略,您都必須使用真實硬件上的儀器仔細檢查其性能。您可能會觸發內存警告下載許多圖像,這將導致圖像緩存被清除(請查看NSCache的文檔) –

1

你可能要考慮Fully-Loaded

簡單的自我維護緩存圖像下載並保存到一個URL有關的文件名。

無論何時您想從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) {}]; 
} 
相關問題