将这些带到枚举循环中。它们枚举一组对象并保存它们。我希望其中每个都能同时运行,但是,我想等到所有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
中创建了一个嵌套效果。还有另一种方法吗?
答案 0 :(得分:1)
尝试使用枚举选项的方法:
- (void)enumerateObjectsWithOptions:(NSEnumerationOptions)opts
usingBlock:(void (^)(id obj,
NSUInteger idx,
BOOL *stop))block
来自文档:
指定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
。