ios - 如何确定循环内所有异步调用的结束?
问题描述
我有一个组合多个视频的应用程序,显示并选择 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;
}];
}
解决方案
您可以存储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
}
}];
}
推荐阅读
- terraform - Terraform:创建两个 AWS EC2 实例并从变量传递私有 IP
- java - 如何使用流口水对列表中的元素进行分组
- docker - TensorFlow-serving docker 容器添加了 GPU 设备,但 GPU 的利用率为 0%
- javascript - 未捕获的 CKEditorError:ckeditor-duplicated-modules
- r - 如何从R中的varImp函数对不同的列进行排序
- php - 将 Laravel 用户和密码表迁移到 Django
- android - 应用程序有时会在 androidx.appcompat.widget.ContentFrameLayout.setDecorPadding() 方法上崩溃
- javascript - HTML在图像onclick上再次打开新窗口
- php - PHP 在edit.php 中删除并重新插入表单中的所有数据
- go - 将多个 tcp 流写入单个文件的最佳方法是什么?