UICollectionView: descarga de imágenes y recarga efectiva de datos, como Instagram
Noté que aplicaciones como Intagram usanUICollectionViews
para visualizar el feed de fotos. También noté que las celdas de estas fotos de alguna manera se colocan en la pantalla.antes de Las fotos reales se descargan completamente. Luego, cuando se completa una descarga, esa foto se muestra bien en la celda correcta.
Me gustaría copiar esa funcionalidad, pero no sé cómo hacerlo.
Actualmente estoy descargando un granJSON objeto que transformo en una matriz deNSDictionaries. CadaNSDictionary
contiene información sobre cada foto, y entre esa información, se presenta una URL. En esta URL, puedo encontrar la imagen correspondiente que necesito descargar y mostrar en miUICollectionViewCells
En este momento, repito esta lista e inicio una descarga para cada URL que veo. Cuando la descarga está completa, recargo la vista de colección usando[self.collectionView reloadData]
. Pero, como pueden imaginar, si tengo 30 celdas que todas quieren una imagen, hay muchasreloadData
llamadas
Estoy usando AFNetworking para manejar la descarga, aquí está el método, al que llamo según la URL que mencioné anteriormente:
-(void) downloadFeedImages:(NSString *) photoURL imageDescs:(NSDictionary*)imageDescs photoId:(NSString *)photoID{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *directory = [paths objectAtIndex:0];
NSString* foofile = [directory stringByAppendingPathComponent:photoID];
if([[NSFileManager defaultManager] fileExistsAtPath:foofile]){
// IF IMAGE IS CACHED
[self.collectionView reloadData];
return;
}
NSLog(@"photoURL: %@", photoURL);
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:photoURL]];
AFImageRequestOperation *operation = [AFImageRequestOperation imageRequestOperationWithRequest:request
imageProcessingBlock:nil
success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
// Save Image
NSLog(@"URL-RESPONSE:%@", image);
NSString *myFile = [directory stringByAppendingPathComponent:photoID];
NSData *imageData = UIImagePNGRepresentation(image);
[imageData writeToFile:myFile atomically: YES];
[self.collectionView reloadData];
}
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
NSLog(@"ERROR: %@", [error localizedDescription]);
}];
[[WebAPI sharedInstance] enqueueHTTPRequestOperation:operation];
}
Asi que Básicamente, me pregunto cómo puedo lograr la funcionalidad que tienen Instagram y aplicaciones similares cuando se trata de mostrar un feed con imágenes. Además, me gustaría saber una buena manera de iniciar una descarga para cada celda, y cuando la descarga haya finalizado, actualice esa celda, no vuelva a dibujar toda la vista con[reloadData]
Gracias