2012-06-28 3 views
8

Quando viene caricata la mia app, seleziono una rappresentazione JSON di 99 oggetti.Immagini pre-cache per la UIImage di AFNetworkingVisualizza categoria

Ogni oggetto ha un campo "image_url", che passo a AFNetworking setImageWithURLRequest.

Le mie immagini vengono caricate in una tabellaView e, di conseguenza, solo le prime diverse celle eseguono richieste per le loro immagini. Non è fino a quando non scorrono le richieste di immagini successive.

Dopo aver estratto il set di dati iniziale, mi piacerebbe essere in grado di avviare un processo in background che si spegne e scarica i circa 95 oggetti che non sono inizialmente visibili e li memorizza in modo tale che quando viene chiamato setImageWithURLRequest, avrà già un'immagine memorizzata nella cache.

AFImageCache è privato, quindi non sono sicuro che sia possibile. So che potrei fare il cache con NSURLCache, ma poi avrei due cache separate e isolate, e non è nemmeno l'ideale.

È la mia unica opzione per non utilizzare la categoria UIImageView di AFNetworking?

Queste risposte mi fanno pensare così:

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

+0

La memorizzazione nella cache di 95 immagini su RAM richiederebbe molto ram. Se si esegue questa operazione, non utilizzare la cache integrata, ma compilare una cache del disco nella directory della cache. –

+0

Ho esattamente lo stesso problema. Sto memorizzando le immagini sul disco. Ma quando sto cercando di caricarli dalla cache, a volte non vengono trovati. Ho fatto la domanda su http://stackoverflow.com/questions/12882639/how-should-i-pre-load-all-images-and-cache-them-using-afnetworking – Burak

risposta

24

Si prega, si prega di non farlo.

Fidati di me quando dico che questo quasi certamente non è necessario.

In effetti, probabilmente avrà l'opposto dell'effetto desiderato, a causa della maggiore pressione di download delle immagini che probabilmente non verranno mai visualizzate.

La cache è privata per un ottimo motivo: è proprio lì per accelerare le richieste successive nelle visualizzazioni di scorrimento.Basta avere la vista tabella per scaricare le immagini come richiesto, e dovresti stare bene. Se possibile, puoi ottimizzare la dimensione delle immagini che stai scaricando (assicurati che le dimensioni dell'immagine siano corrette, comprimi in modo intelligente).

+4

Come si imposterà solo le prossime 3 o 4 immagini? –

3

Ecco una soluzione - creare alcuni UIImageView oggetti (ma non li aggiungere come subviews) e poi usare di AFNetworking categoria UIImageView a prendere il immagini e popola la sua cache interna.

codice di esempio:

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

interessante. In realtà avevo lo stesso pensiero, ma non ero sicuro del sovraccarico di tutte le UIImageViews che avrei creato. Non è qualcosa di cui dovrei preoccuparmi? lo farei con 100-500 immagini. – djibouti33

+0

L'utilizzo della memoria degli oggetti UIImage supererà di gran lunga quello di UIImageViews (soprattutto se non vengono mai aggiunti come sottoview). Qualunque sia la strategia che usi, dovresti controllare attentamente le sue prestazioni con strumenti su hardware reale. È possibile che vengano attivati ​​avvisi di memoria durante il download di più immagini, il che comporterà la cancellazione della cache dell'immagine (consultare la documentazione di NSCache) –

1

Probabilmente si desidera prendere in considerazione Fully-Loaded

Un semplice auto di cache mantenuto è quello di scaricare le immagini e salvare in un nome di file URL dipendente.

Ogni volta che si desidera caricare un'immagine da un URL, provare prima a leggere dal disco rigido - se è stato restituito nil, procedere con il downloader di immagini.

Ricordarsi di cancellare le cache delle immagini.

5

NON creerei un gruppo di UIImageView per raggiungere il tuo scopo, sarebbe un approccio davvero inefficiente.

È possibile aggiungere il proprio metodo a UIImageView+AFNetworking.h per ottenere questa capacità. Sottile questo sarebbe l'approccio migliore. Un esempio potrebbe essere testato:

+ (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) {}]; 
}