2010-08-18 13 views
5

¿Cuál es una forma decente de cargar UIImages a pedido sin bloquear el hilo principal?Lazy Loading UIImages de archivos sin bloquear el hilo principal?

Contexto: Tengo un par de miles de imágenes en una pared por las que puedo desplazarme. Obviamente, no es posible cargar todos los UIImages, por lo que en este momento solo estoy cargando los que se muestran y luego soltándolos cuando ya no son necesarios. El problema es que la carga de UIImages desde archivos lleva un tiempo notable, el tiempo suficiente para causar tartamudez mientras se desplaza. Estas no son de ninguna manera imágenes grandes (alrededor de 250x250, tal vez 20-30kb cada una), pero todavía causan tartamudeo.

Respuesta

0

Uso una subclase UIImageView personalizada para algo similar a esto. Se usa principalmente para descargar imágenes (por ejemplo, avatares e imágenes en una transmisión de Twitter), por lo que usa una NSURLConnection para descargar la imagen desde una URL. El URLConnection luego llama a un método de delegado cuando termina, que luego uso para actualizar el UIImageView. Un extra que agregué más tarde es un diccionario estático con imágenes en caché, por lo que las imágenes que se usan con más frecuencia no tienen que descargarse cada vez. Esto es bastante útil para cosas como los avatares de Twitter mencionados anteriormente.

No estoy seguro de si está tratando de cargar las imágenes de la web o localmente, por lo que este podría no aplicarse perfectamente a su situación, pero espero que esto ayude ...

0

Usted puede hacer esto muy simplemente forma. Primero crea una cola cuando crees un objeto UIScrollView. Después de crear, puede cargar imágenes desde su almacenamiento local con la cola recién creada.

//get a dispatch queue 
dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 


//this will start the image loading in bg 
dispatch_async(concurrentQueue, ^{   
    NSData *image = [[NSData alloc] initWithContentsOfURL:imageURL]; 

    //this will set the image when loading is finished 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     imageView.image = [UIImage imageWithData:image]; 
    }); 
}); 
Cuestiones relacionadas