Ios 使用_块的竞争条件

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

我有一个PHAsset列表,我需要获取它们的关联URL,并对每个URL进行处理。处理完所有资产后,我需要执行另一项任务。我尝试使用_块来计算所处理的资产,但由于竞争条件,它不可靠。是否有更好的方法知道何时处理所有资产

    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
可能
调度组进入()
调度组离开()
调度组通知()