首页 > 解决方案 > 如何确定循环内所有异步调用的结束?

问题描述

我有一个组合多个视频的应用程序,显示并选择 PHAsset 的初始列表以形成 PHAsset 数组。现在在创建视频的屏幕上,我需要循环并从 PHAsset 中获取 AVAsset。

我想了解的问题是如何跟踪进度并确定所有异步提取的结束。循环完成后,我可以开始实际组合所有视频。

 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;


        }];

    }

标签: iosobjective-cavmutablecomposition

解决方案


您可以存储self.arraySelectedAssets的长度并在循环外声明一个计数器变量。

然后,在每个回调中增加计数器变量并添加一个 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
        }

    }];

}

推荐阅读