¿Cómo diseñaría un descargador de imágenes asíncrono para mi UITableView que prioriza las descargas según la location en la vista de tabla?

En mi aplicación, recibo una list de URL de imágenes para usar como miniaturas en mi vista de tabla. La vista de tabla tiene una pequeña cantidad de elementos, aproximadamente 30, por lo que quiero cargar todas las miniaturas inmediatamente (en lugar de cuando se vuelvan visibles, ya que, sin duda, se volverán visibles y quiero que se carguen completamente).

Quiero priorizar las descargas de imágenes por ruta de índice, por lo que la primera ruta de índice tiene prioridad sobre la segunda, que tiene prioridad sobre la tercera, etc.

Sin embargo , si de repente salto al final de la vista de tabla (que muestra, por ejemplo, las routes de índice 24-29), quiero que las imágenes de esas routes de índice se conviertan en la prioridad más alta, de modo que si saltan al principio, no lo harán Tengo que esperar a que todos los demás se descarguen primero.

¿Cómo haría para diseñar algo así? Si es posible con SDWebImage sería genial, ya que me siento cómodo con eso, pero si no, estoy más que bien con crear algo desde cero con NSURLSession . (Miré SDWebImage , y SDWebImagePrefetcher parece prometedor, pero no permite cambiar la prioridad de lo que he visto).

Recientemente tuve un problema similar, pero no tenía que tener prioridad para cargar. No puedo pensar cómo cambiar la prioridad de lo que se carga a less que hagas la carga de miniaturas antes de cargar la vista de tabla. Tableviews carga las celdas según se necesiten.

Puedo pensar en dos opciones:

  1. Si desea que todos los datos estén cargados y listos antes de cargar la tableview, cargue los datos de forma preventiva en un controller de vista anterior y guárdelos para que se abra en el controller de vista que contiene la vista de tabla. Entonces su table no tendrá que realizar requestes y todo aparecerá sin problemas.

  2. La vista de tabla envía cada request de miniatura de forma asíncrona y actualiza la celda a medida que las imágenes llegan al hilo principal. A continuación, puede almacenar en caching o save las imágenes después de que lleguen. Pero las imágenes no aparecerán instantáneamente, generalmente una fracción de segundo más tarde.

Hice la opción dos usando NSCache. El valor de la key "avatar" es la URL de la image en miniatura. Este código se encuentra en mi - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

 if (![teamMember[@"avatar"] isEqualToString:@""]) { // check for cached image, use if it exists UIImage *cachedImage = [self.imageCache objectForKey:teamMember[@"avatar"]]; if (cachedImage) { cell.memberImage.image = cachedImage; } //else retrieve the image from server else { NSURL *imageURL = [NSURL URLWithString:teamMember[@"avatar"]]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ NSData *imageData = [NSData dataWithContentsOfURL:imageURL]; // if valid data, create UIImage if (imageData) { UIImage *image = [UIImage imageWithData:imageData]; // if valid image, update in tableview asynch if (image) { dispatch_async(dispatch_get_main_queue(), ^{ TeamCommitsCell *updateCell = (id)[tableView cellForRowAtIndexPath:indexPath]; // if valid cell, display image and add to cache if (updateCell) { updateCell.memberImage.image = image; [self.imageCache setObject:image forKey:teamMember[@"avatar"]]; } }); } } }); } 

}