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]

Спасибо

Ответы на вопрос(3)

Ваш ответ на вопрос