2012-06-28 11 views
8

Cuando se carga mi aplicación, selecciono una representación JSON de 99 objetos.Pre-caché Imágenes para la categoría UIImageView de AFNetworking

Cada objeto tiene un campo 'image_url', que paso a AFNetworking's setImageWithURLRequest.

Mis imágenes se cargan en un tableView, y en consecuencia, solo las primeras celdas hacen solicitudes para sus imágenes. No es hasta que me desplazo hacia abajo que se realizan las solicitudes de imágenes posteriores.

Una vez que despliegue el conjunto de datos inicial, me gustaría poder iniciar un proceso de fondo que se apaga y descarga los aproximadamente 95 objetos que no son visibles inicialmente, y almacenarlos en caché de tal manera que cuando se llama al setImageWithURLRequest, ya tendrá una imagen almacenada en caché desde la que extraer.

AFImageCache es privado, así que no estoy seguro si esto es posible. Sé que podría guardar en caché con NSURLCache, pero luego tendría dos cachés aislados y aislados, y eso tampoco es ideal.

¿Mi única opción es no utilizar la categoría UIImageView de AFNetworking?

Estas respuestas me hacen pensar así:

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

+0

El almacenamiento en memoria caché de 95 imágenes para ram tendría una gran cantidad de ram. Si lo hace, no use la memoria caché incorporada, sino que cree una memoria caché de disco en el directorio de caché. –

+0

Tengo exactamente el mismo problema. Estoy almacenando en caché las imágenes en el disco. Pero cuando intento cargarlos desde el caché, a veces no se encuentran. Hice la pregunta en http://stackoverflow.com/questions/12882639/how-should-i-pre-load-all-images-and-cache-them-using-afnetworking – Burak

Respuesta

24

Por favor, póngase en no hacen esto.

Confíe en mí cuando digo que esto es casi innecesario.

De hecho, es probable que tenga el efecto contrario al deseado, debido a la mayor presión de descarga de imágenes que probablemente nunca se verá.

La caché es privada por una muy buena razón: está allí para acelerar las solicitudes posteriores en las vistas de desplazamiento.Simplemente haga que la vista de tabla descargue las imágenes según lo solicitado, y debería estar bien. En todo caso, puede optimizar el tamaño de las imágenes que está descargando (asegúrese de que las dimensiones de la imagen sean correctas, comprima de forma inteligente).

+4

¿Cómo precargaría solo las siguientes 3 o 4 imágenes? –

3

Aquí hay una solución - crear algunos UIImageView objetos (pero no se suman como subvistas) y luego usar la categoría UIImageView de AFNetworking a buscar el imágenes y poblar su caché interna.

Código de ejemplo:

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

interesante. De hecho, tuve el mismo pensamiento, pero no estaba seguro de la sobrecarga general de todos los UIImageViews que estaría creando. ¿No es algo de lo que debería preocuparme? Haría esto con 100-500 imágenes. – djibouti33

+0

El uso de memoria de los objetos UIImage superará por mucho al de UIImageViews (especialmente si nunca se agregan como subvistas). Independientemente de la estrategia que utilice, deberá verificar cuidadosamente su rendimiento con Instruments en hardware real. Puede desencadenar advertencias de memoria descargando muchas imágenes, lo que provocará que la caché de imágenes se borre (consulte la documentación de NSCache) –

1

Es posible que desee considerar Fully-Loaded

Un simple auto caché es mantenido para descargar las imágenes y guardar en un nombre de archivo depende url.

Cuando quiera cargar una imagen desde una url, primero intente leer desde el disco duro: si no se devolvió, continúe con el descargador de imágenes.

No olvide borrar sus cachés de imagen.

5

NO crearía un montón de UIImageView para lograr su propósito, sería un enfoque realmente ineficiente.

Puede agregar su propio método al UIImageView+AFNetworking.h para lograr esta habilidad. Creo que este sería el mejor enfoque. Un ejemplo sería no probado:

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