对数组中的对象执行块操作并在全部完成时完成

Performing block operations on objects in array and completing when all complete

我有一组对象,我想对其执行块操作。我不确定执行此操作的最佳方法。我正在做类似下面代码的事情,但我认为这不是最佳做法。 执行此类操作的最佳方法是什么?

- (void)performBlockOnAllObjects:(NSArray*)objects completion:(void(^)(BOOL success))completionHandler {
    NSInteger counter = objects.count;
    for (MyObject *obj in objects) {
        [obj performTaskWithCompletion:^(NSError *error) {
            counter--;
            if (counter == 0) {
                completionHandler(YES);
            }
        }];    
    }
}

通常您会为此使用调度组。你在调用你的方法之前 "enter" 组,你在完成处理程序中 "leave",然后指定一个块,当组通知你所有 "enter" 调用都已被抵消时应该调用该块有 "leave" 个电话。

- (void)performBlockOnAllObjects:(NSArray*)objects completion:(void(^)(BOOL success))completionHandler {

    dispatch_group_t group = dispatch_group_create();

    for (MyObject *obj in objects) {
        dispatch_group_enter(group);
        [obj performTaskWithCompletion:^(NSError *error) {
            dispatch_group_leave(group);
        }];
    }

    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        completionHandler(YES);
    });
}

这是用于指定在一系列其他异步任务完成时异步调用的代码块的典型模式。