Estoy usando Grand Central Dispatch para cargar imágenes de UITableViewCell
de forma asíncrona. Esto funciona bien, excepto en algunos casos fronterizos en los que se reutiliza la celda y un bloque anterior carga la imagen incorrecta.Reutilizando UITableViewCell con GCD
Mi código actual es el siguiente:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (!cell) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
NSString *imagePath = [self imagePathForIndexPath:indexPath];
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
dispatch_async(queue, ^{
UIImage *image = [UIImage imageWithContentsOfFile:imagePath];
dispatch_sync(dispatch_get_main_queue(), ^{
cell.imageView.image = image;
[cell setNeedsLayout];
});
});
return cell;
}
Por lo que yo sé colas GCD no se puede detener. ¿Cómo se puede prevenir este caso fronterizo? ¿O debería usar algo más en lugar de GCD para resolver este problema?
Estoy usando GMGridView para mostrar una gran cantidad de miniaturas de imágenes y tener exactamente el mismo problema con ellas. También estoy usando GCD para cargar miniaturas de mi servidor web sobre la marcha. – Humayun