同时在组中运行操作,但运行然后串行运行这些操作的批次

时间:2015-02-12 17:39:19

标签: objective-c grand-central-dispatch

将这些带到枚举循环中。它们枚举一组对象并保存它们。我希望其中每个都能同时运行,但是,我想等到所有categoriesMainToSave返回后再开始categoriesSubToSave批次。

    // Save all the categories
    [categoriesMainToSave enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        CategoryMain* main = (CategoryMain*)obj;
        [[BFClientAPI sharedAPI] createCategoryMain:main withSuccess:^{

        } failure:^(NSError *error) {
            NSLog(@"error = %@",error);

        }];

    }];

    [categoriesSubToSave enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        CategorySub* sub = (CategorySub*)obj;
        [[BFClientAPI sharedAPI] createCategorySub:sub withSuccess:^{

        } failure:^(NSError *error) {
            NSLog(@"error = %@",error);

        }];

    }];

我开始尝试调度组:

        dispatch_group_t groupMain = dispatch_group_create();

        [categoriesMainToSave enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

            dispatch_group_enter(groupMain);
            CategoryMain* main = (CategoryMain*)obj;
            [[BFClientAPI sharedAPI] createCategoryMain:main withSuccess:^{
                dispatch_group_leave(groupMain);

            } failure:^(NSError *error) {
                NSLog(@"error = %@",error);
                dispatch_group_leave(groupMain);

            }];
        }];

        dispatch_group_notify(groupMain,dispatch_get_main_queue(),^{
            // Repeat dispatch_group pattern with categoriesSubToSave here
        });

然后我在dispatch_group_notify中创建了一个嵌套效果。还有另一种方法吗?

2 个答案:

答案 0 :(得分:1)

尝试使用枚举选项的方法:

- (void)enumerateObjectsWithOptions:(NSEnumerationOptions)opts
                     usingBlock:(void (^)(id obj,
                                          NSUInteger idx,
                                          BOOL *stop))block

选项NSEnumerationConcurrent

来自文档:


指定Block枚举应该是并发的。

调用的顺序是不确定的和未定义的;这个标志是一个提示,在某些情况下可能会被实施忽略;块的代码必须是安全的,以防止并发调用。


<强> UPD

如果createCategoryMain是并发操作。您需要同步许多异步操作。您可以使用NSOperation和NSOperationQueue。操作允许在操作之间建立依赖关系。您可以创建操作列表,这些操作将从categoriesMainToSave(第一组)初始化类别,以及将从categoriesSubToSave(第二组)初始化类别的操作列表。然后,您可以在第二组和第一组之间建立操作之间的依赖关系。然后将这些操作添加到NSOperationsQueue。但我想,现在你有一个非常简单的解决方案。

答案 1 :(得分:1)

使用调度组是一个很好的解决方案。如果您不想在categoriesSubToSave块中嵌套dispatch_group_notify作品,则可以使用dispatch_group_wait代替:

    dispatch_group_t group = dispatch_group_create();
    for (CategoryMain *main in categoriesMainToSave) {
        dispatch_group_enter(group);
        [[BFClientAPI sharedAPI] createCategoryMain:main withSuccess:^{
            dispatch_group_leave(group);
        } failure:^(NSError *error) {
            NSLog(@"error = %@",error);
            dispatch_group_leave(group);
        }];
    }

    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
    // All mains are now saved or failed.

    for (CategorySub *sub in categoriesMainToSave) {
        dispatch_group_enter(group);
        [[BFClientAPI sharedAPI] createCategorySub:sub withSuccess:^{
            dispatch_group_leave(group);
        } failure:^(NSError *error) {
            NSLog(@"error = %@",error);
            dispatch_group_leave(group);
        }];
    }

    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
    // All subs are now saved or failed.

但是,如果此代码在主线程上运行,那么这是一个非常糟糕的主意。如果您从主线程启动保存,或者从另一个线程启动保存,则应使用dispatch_group_notify