2010-06-10 17 views
6

Tengo un UITableView en mi aplicación en la que cargo varias imágenes desde NSDocumentDirectory. Es funciona, pero cuando se desplaza hacia arriba y hacia abajo, la aplicación parece congelarse un poco, muy probablemente debido a las imágenes que se muestran en el hilo principal, bloqueando de manera efectiva el desplazamiento de tableView hasta que se carga. Mi problema es que no sé cómo cargarlos más tarde, una función de "carga lenta" mientras se desplaza.¿Imágenes de carga lenta para UITableViewCells desde NSDocumentDirectory?

Este es el fragmento de código utilizado para cargar las imágenes ahora:

imagesPath = [NSString stringWithFormat:@"%@/images/", [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]]; 
if ([fileManager fileExistsAtPath:[imagesPath stringByAppendingPathComponent:[NSString stringWithFormat:@"/%d.png", rowID]]]) { 
    UIImage *image = [[UIImage alloc] initWithContentsOfFile:[imagesPath stringByAppendingPathComponent:[NSString stringWithFormat:@"/%d.png", rowID]]]; 
    // If image contains anything, set cellImage to image. If image is empty, use default, noimage.png. 
    if (image != nil){ 
     // If image != nil, set cellImage to that image 
     cell.cellImage.image = image; 
    } 
    [image release]; 
} 

¿Cuál es la mejor manera de "carga perezosa" las imágenes en cada celda para evitar el retraso en el desplazamiento?

Respuesta

7

Eche un vistazo al repositorio SDWebImage. Proporciona todo para realizar la carga de imágenes asíncrona.

actualización

simplemente me di cuenta de que hay algunos errores tipográficos en el README, por lo que la descarga de un archivo local puede no funcionar como se espera.

Aquí hay algunos ejemplos de código. El controlador de vista tiene una salida UIImageView y desea cargar el archivo image.jpg. Se implementa el protocolo de SDWebImageManagerDelegate:

- (IBAction)loadImage:(id)sender { 
    SDWebImageManager *manager = [SDWebImageManager sharedManager]; 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *destPath = [documentsDirectory stringByAppendingPathComponent:@"image.jpg"]; 
    NSURL *url = [NSURL fileURLWithPath:destPath]; 
    UIImage *cachedImage = [manager imageWithURL:url]; 
    if (cachedImage) 
    { 
     imageView.image = cachedImage; 
    } 
    else 
    { 
     // Start an async download 
     [manager downloadWithURL:url delegate:self]; 
    }  
} 

- (void)webImageManager:(SDWebImageManager *)imageManager didFinishWithImage:(UIImage *)image 
{ 
    imageView.image = image; 
} 
+0

No estoy tratando de descargar una imagen, que estoy tratando de cargar en una imagen de NSDocumentDirectory. – Emil

+0

La descarga debe entenderse como el acceso a cualquier recurso admitido por NSURL. NSURL se puede utilizar para varios protocolos: http, ftp o archivo. Convierta su ruta a un NSURL y "descargue" su archivo local. –

+0

¡Lo intento, pero no funciona! El NSURL se carga desde una cadena: 'file: // var/mobile/Applications/RANDOMIDENTIFIER/Documents/images/10.png'. – Emil