Как определить окончание всех асинхронных вызовов из цикла? - PullRequest
0 голосов
/ 28 августа 2018

У меня есть приложение, которое объединяет несколько видео, первоначальный список PHAssets отображается и выбирается для формирования массива PHAssets. Теперь на экране, который создает видео, мне нужно просмотреть и извлечь AVAsset из PHAsset.

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

 for (PHAsset * object in self.arraySelectedAssets) {

        [[PHImageManager defaultManager] requestAVAssetForVideo:object options:nil resultHandler:^(AVAsset *avAsset, AVAudioMix *audioMix, NSDictionary *info) {

            NSLog(@"Fetched");

            //here asset in nil! IOS 10 only, IOS 11 works fine
            AVURLAsset * assetUrl = (AVURLAsset*)avAsset;


        }];

    }

1 Ответ

0 голосов
/ 28 августа 2018

Вы можете хранить длину self.arraySelectedAssets и иметь счетчик var, объявленный вне цикла.

Затем в каждом обратном вызове вы увеличиваете переменную счетчика, а также добавляете if, чтобы проверить, равен ли счетчик длине.

В этом случае вы знаете, что у вас есть все активы.

int total = [self.arraySelectedAssets count];
int count = 0;

for (PHAsset * object in self.arraySelectedAssets) {

    [[PHImageManager defaultManager] requestAVAssetForVideo:object options:nil resultHandler:^(AVAsset *avAsset, AVAudioMix *audioMix, NSDictionary *info) {

        NSLog(@"Fetched");

        //here asset in nil! IOS 10 only, IOS 11 works fine
        AVURLAsset * assetUrl = (AVURLAsset*)avAsset;

        count ++;

        if (count == total) {
           //do your stuff
        }

    }];

}
...