Получение миниатюры видео из видео требует времени, а прокрутка таблицы застревает при создании новых кадров из видео

Я пытаюсь получить миниатюру из видео, прокрутка таблицы застревает при создании изображения из видео, когда таблица повторно использует ячейки. Что я пробовал до сих пор с этим кодом

dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{


                            UIActivityIndicatorView *indicatorG = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];

                            dispatch_async( dispatch_get_main_queue(), ^{
                                [indicatorG removeFromSuperview];
                                [indicatorG startAnimating];
                                [indicatorG setCenter:Cell.thumbnail.center];
                                [Cell.thumbnail addSubview:indicatorG];
                            });

                            AVURLAsset *asset=[[AVURLAsset alloc] initWithURL:url options:nil];
                            AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
                            generator.appliesPreferredTrackTransform=TRUE;
                            float getDuration = CMTimeGetSeconds(asset.duration);
                            CMTime thumbTime = CMTimeMakeWithSeconds(0,1);

                            AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, CGImageRef im, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error){

                                if (result != AVAssetImageGeneratorSucceeded) {

                                    NSLog(@"couldn't generate thumbnail, error:%@", error);

                                }
                                else{

                                    UIImageView *imgV;

                                         imgV = [[UIImageView alloc] initWithImage:[UIImage imageWithCGImage:im]];


                                    dispatch_async( dispatch_get_main_queue(), ^{


                                            [indicatorG stopAnimating];
                                            Cell.thumbnail.image = imgV.image;

                                    });
                                }
                                //        [button setImage:[UIImage imageWithCGImage:im] forState:UIControlStateNormal];
                            };

                            CGSize maxSize = CGSizeMake(320, 180);
                            generator.maximumSize = maxSize;
                            [generator generateCGImagesAsynchronouslyForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:thumbTime]] completionHandler:handler];

                        });

но проблема прокрутки таблицы решается с помощью асинхронной отправки, новая проблема заключается в том, что этот код нарушает порядок миниатюрных изображений, кто-нибудь, пожалуйста, помогите?

Изменить:

URL-код:

 NSString *strUrl = [NSString stringWithFormat:@"%@",url];  
 NSURL *url = [NSURL URLWithString:strUrl];

person John    schedule 09.10.2017    source источник
comment
Пусть блок сохранит indexPath ячейки. Так ваш заказ не испортится.   -  person Mercurial    schedule 09.10.2017
comment
@Mercurial Я новичок в iOS, можете ли вы подробно объяснить это?   -  person John    schedule 09.10.2017
comment
ваш URL отличается для каждой строки таблицы?   -  person 3stud1ant3    schedule 09.10.2017
comment
Да, мой URL-адрес отличается для каждого, но вызов блока завершения каждый раз откладывается, поэтому я думаю, что независимо от того, какое изображение создается первым, оно вставляет изображение в соответствии с пользователем, прокручивающим страницу.   -  person John    schedule 09.10.2017
comment
как вы передаете URL-адрес в этот код, можете ли вы показать эту часть кода?   -  person 3stud1ant3    schedule 09.10.2017
comment
пожалуйста, проверьте редактирование.   -  person John    schedule 09.10.2017
comment
у меня такая же проблема? Кто-нибудь может сказать решение.   -  person Sunil kr singh    schedule 09.10.2017


Ответы (1)


Если этот код постоянно выполняется в cellForItemAtIndexPath при прокрутке табличного представления, это не очень хорошая реализация. Вызов для создания изображения из видео в cellForItemAtIndexPath довольно затратный.

Вместо подготовки миниатюр в cellForItemAtIndexPath подготовьте и сохраните миниатюры перед загрузкой данных в табличное представление. Или, по крайней мере, хранить миниатюры где-то после обработки в cellForItemAtIndexPath при прокрутке для повторного использования. В следующий раз используйте сохраненные миниатюры в cellForItemAtIndexPath и всегда обновляйте изображение ячейки.

person Cagatay Kaptanoglu    schedule 09.10.2017
comment
Идея хорошая, я думал сделать это так же, но проблема в том, что создание каждой миниатюры занимает 1 секунду в зависимости от подключения к Интернету, я также пытался реализовать это, но что, если в табличном представлении слишком много видеопостов, и это займет так много секунд я понял, что реализация миниатюр не является хорошей идеей в cellforrowatindexpath, но все же, если мы одновременно генерируем миниатюры асинхронно в фоновом потоке, для создания большого количества миниатюр потребуется всего несколько секунд. - person John; 10.10.2017