UICollectionView - загрузка изображений и эффективная перезагрузка данных, таких как Instagram
Я заметил, что такие приложения, как Intagram, используютUICollectionViews
для отображения ленты фотографий. Я также заметил, что клетки для этих фотографий как-то размещены на экранедо реальные фотографии загружены полностью. Затем, когда загрузка завершается, эта фотография красиво отображается в правильной ячейке.
Я хотел бы скопировать эту функциональность, но я не знаю, как это сделать.
Я сейчас загружаю большойJSON объект, который я преобразую в массивNSDictionaries, каждыйNSDictionary
содержит информацию о каждой фотографии, и среди этой информации представлен URL. По этому URL я могу найти соответствующее изображение, которое мне нужно скачать, и отобразить в моемUICollectionViewCells
На данный момент, я повторяю этот список и запускаю загрузку для каждого URL, который я вижу. Когда загрузка завершена, я перезагружаю коллекцию с помощью[self.collectionView reloadData]
, Но, как вы можете себе представить, если у меня есть 30 ячеек, которые все хотят изображения, есть многоreloadData
звонки.
Я использую AFNetworking для обработки загрузки, вот метод, который я вызываю на основе URL, который я упоминал ранее:
-(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];
}
Так в основном, мне интересно, как я могу добиться функциональности Instagram и подобных приложений, когда дело доходит до отображения канала с изображениями. Кроме того, я хотел бы знать хороший способ начать загрузку для каждой ячейки, и когда эта загрузка завершится, обновите эту ячейку, а не перерисовывайте весь вид, используя[ReloadData]
Спасибо