UITableview con imágenes se desplaza muy lento

Tengo una UITableView que descarga sus imágenes de tabla de imágenes de un server.

Observé que la table se desplazaba muy despacio.

Pensé que esto podría deberse a la descarga, pero me di count de que la tabla aún se mueve lentamente después de que la descarga haya finalizado y el tamaño del ícono de la image sea muy inferior.

El código:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { btnBack.hidden = FALSE; static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; cell.selectionStyle = UITableViewCellSelectionStyleNone; ///////////////////// Cell other accessories ///////////////////// cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; cell.backgroundColor = [UIColor clearColor]; // cell.backgroundView = [[UIImageView alloc] initWithImage:[[UIImage imageNamed:@"list_1.jpg"] stretchableImageWithLeftCapWidth:0.0 topCapHeight:5.0]]; // cell.selectedBackgroundView = [[UIImageView alloc] initWithImage:[[UIImage imageNamed:@"list_2.jpg"] stretchableImageWithLeftCapWidth:0.0 topCapHeight:5.0]]; ///////////////////// Cell Title ///////////////////// cell.textLabel.font = [UIFont fontWithName:@"Noteworthy" size:17.0]; cell.textLabel.font = [UIFont boldSystemFontOfSize:17.0]; cell.textLabel.textColor = [UIColor blackColor]; cell.textLabel.highlightedTextColor = [UIColor blackColor]; } ///////////////////// Cell Title ///////////////////// cell.textLabel.text = [NSString stringWithFormat:@" %@", [test.arrTitle objectAtIndex:indexPath.row]]; ///////////////////// Cell Image ///////////////////// NSString *Path; Path = [NSString stringWithFormat:@"http://%@",[test.arrImages objectAtIndex:indexPath.row]]; NSLog(@"image-->%@",[test.arrImages objectAtIndex:indexPath.row]); NSString *strImage = Path; NSURL *url4Image = [NSURL URLWithString:strImage]; NSData *data = [NSData dataWithContentsOfURL:url4Image]; image =[[UIImage alloc] initWithData:data]; cell.imageView.image =image; [image release]; return cell; } 

Debe search utilizar un NSOperationQueue para manejar la carga perezosa de imágenes y una tabla de celdas personalizada.
Google para tweetie custom tableviewcell Eso debería orientarte en la dirección correcta.

Apple tiene un proyecto de ejemplo para download imágenes en tableViews: LazyTableImages

Tal vez su image list_bg_01.png es grande? Este método requiere mucha memory, debe usarlo solo cuando la image de patrón sea realmente pequeña y simple, en otras condiciones es mejor usar UIImageView con la image como vista de background.

¿Has ejecutado el profiler en tu código? Como se menciona Nik Burns, debe cargar sus imágenes de la networking de forma asíncrona utilizando GCD o NSOperation. Puede ver el video Harvard iTunesU para NSOperation: le dará un claro ejemplo con buenas explicaciones.

Y definitivamente debe ejecutar el perfilador para ver dónde está pasando la mayor parte del time. Una celda con algunas imágenes debe cargarse rápidamente.

Tenga en count que algunas operaciones en la celda que podrían llevarse a cabo en la initialization (como configurar el color de background en una celda) pueden llegar a costarle mucho performance si las hace repetidamente.

Si tiene un layout especial para su celda, debe subclassar UITableViewCell e implementar el método layoutSubviews (no olvide llamar super). Hacer mucho trabajo en tableViewDataSourceDelegate (y forzar el relevo como lo hace) realmente puede ser ineficiente.

Pero de nuevo: ejecute el perfil

Tuve el mismo problema y se corrigió al no usar la propiedad cornerRadius . Luego usamos una image de background con la forma de la celda.

Me pregunto por qué creas tu image dentro del código de la vista. ¿No puedes crearlo una vez para toda la class y luego colocarlo en UIView a pedido?

La configuration de todo el aspecto general debería estar en if (cell == nil) {} Solo la configuration de elementos únicos, como título, etc., debería estar fuera. Además, si el background de su celda es simple (como gradiente), use el QuartzCore para dibujarlo o use CAGradientLayer como subcapa para la capa de ContentView.