Ios 使用_块的竞争条件
我有一个PHAsset列表,我需要获取它们的关联URL,并对每个URL进行处理。处理完所有资产后,我需要执行另一项任务。我尝试使用_块来计算所处理的资产,但由于竞争条件,它不可靠。是否有更好的方法知道何时处理所有资产Ios 使用_块的竞争条件,ios,objective-c,asynchronous,objective-c-blocks,phasset,Ios,Objective C,Asynchronous,Objective C Blocks,Phasset,我有一个PHAsset列表,我需要获取它们的关联URL,并对每个URL进行处理。处理完所有资产后,我需要执行另一项任务。我尝试使用_块来计算所处理的资产,但由于竞争条件,它不可靠。是否有更好的方法知道何时处理所有资产 PHFetchResult* photosAsset = [PHAsset fetchAssetsInAssetCollection:collection options:fetchOptions2]; __block int count = 0; for
PHFetchResult* photosAsset = [PHAsset fetchAssetsInAssetCollection:collection options:fetchOptions2];
__block int count = 0;
for (int i = 0; i < photosAsset.count; ++i) {
[[PHImageManager defaultManager] requestAVAssetForVideo:[photosAsset objectAtIndex:i] options:nil resultHandler:
^(AVAsset *avAsset, AVAudioMix *audioMix, NSDictionary *info) {
NSURL *url = [(AVURLAsset *)avAsset URL];
// then do something with the url here...
++count;
NSLog(@"%d", count);
if (count == photosAsset.count) {
NSLog(@"FINISHED!");
}
}];
}
PHFetchResult*photosAsset=[PHAsset fetchAssetsInAssetCollection:collection options:fetchOptions2];
__块整数计数=0;
对于(int i=0;i
以下是基于@Larme建议的解决方案:
dispatch_group_t group = dispatch_group_create();
for (int i = 0; i < photosAsset.count; ++i) {
dispatch_group_enter(group);
[[PHImageManager defaultManager] requestAVAssetForVideo:[photosAsset objectAtIndex:i] options:nil resultHandler:
^(AVAsset *avAsset, AVAudioMix *audioMix, NSDictionary *info) {
dispatch_group_leave(group);
}];
}
dispatch_group_notify(group,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^ {
NSLog(@"FINISHED!");
});
dispatch_release(group);
dispatch\u group\u t group=dispatch\u group\u create();
对于(int i=0;i
可能调度组进入()
,调度组离开()
和调度组通知()
?