对数组中的对象执行块操作,并在完成所有操作时完成

时间:2015-12-30 15:42:52

标签: ios objective-c objective-c-blocks

我有一个对象数组,我想在其上执行块操作。我不确定这样做的最好方法。我正在做类似下面的代码,但我不认为这是最好的做法。 做这种手术的最佳方法是什么?

- (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);
            }
        }];    
    }
}

1 个答案:

答案 0 :(得分:6)

通常,您为此使用调度组。你"输入"在你打电话给你的方法之前,你要离开"离开"在完成处理程序中,然后指定当组通知您所有"输入"时应该调用的块。通过"离开"调用

- (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);
    });
}

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