En un UITableView, ¿el mejor método para cancelar las operaciones GCD para las celdas que han salido de la pantalla?
tengo unUITableView
que carga imágenes de una URL en celdas de forma asíncrona utilizando GCD. El problema es que si un usuario pasa las 150 filas, 150 operaciones se ponen en cola y se ejecutan. Lo que quiero es poner en cola / cancelar los que pasaron volando y salieron de la pantalla.
¿Cómo hago esto?
Mi código en este punto (bastante estándar):
<code>- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath // after getting the cell... dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ if (runQ) { NSString *galleryTinyImageUrl = [[self.smapi getImageUrls:imageId imageKey:imageKey] objectForKey:@"TinyURL"]; NSData *imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:galleryTinyImageUrl]]; dispatch_async(dispatch_get_main_queue(), ^{ if (imageData != nil) { UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; cell.imageView.image = [UIImage imageWithData:imageData]; } }); } }); </code>
runQ es unBOOL
ivar me puse aNO
enviewWillDisappear
, lo que (creo) tiene el efecto de limpiar la cola rápidamente cuando estoUITableView
se sale del controlador de navegación.
Entonces, volviendo a mi pregunta original: ¿cómo cancelo las operaciones de recuperación de imagen para las celdas que se han salido de la pantalla? Gracias.