dispatch_group_t - EXC_BAD_INSTRUCTION
dispatch_group_t - EXC_BAD_INSTRUCTION
这是我第一次使用 dispatch_group_t
,我犯了一个简单的错误。 dispatch_group_notify
在任何异步调用返回之前被调用,因此甚至在第一个 dispatch_group_leave(group)
之前被调用,然后抛出 EXC_BAD_INSTRUCTION
。
但是,我不知道为什么会这样。
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{
[self getCategoriesMainWithParameters:nil withSuccess:^(NSArray *objects) {
[categoriesMain addObjectsFromArray:objects];
dispatch_group_leave(group);
} failure:^(NSError *error) {
groupError = error;
dispatch_group_leave(group);
}];
});
dispatch_group_async(group, queue, ^{
[self getCategoriesSubWithParameters:nil withSuccess:^(NSArray *objects) {
[categoriesSub addObjectsFromArray:objects];
dispatch_group_leave(group);
} failure:^(NSError *error) {
groupError = error;
dispatch_group_leave(group);
}];
});
dispatch_group_async(group, queue, ^{
[self getCategoriesProductWithParameters:nil withSuccess:^(NSArray *objects) {
[categoriesProduct addObjectsFromArray:objects];
dispatch_group_leave(group);
} failure:^(NSError *error) {
groupError = error;
dispatch_group_leave(group);
}];
});
dispatch_group_notify(group,dispatch_get_main_queue(),^{
...
});
函数dispatch_group_async
在调度块时自动“进入”组,并在调度块完成时自动“离开”。但是你再次调用 dispatch_group_leave
,所以你最终调用了太多的“离开”,导致你描述的错误。
应该调用 dispatch_group_async
(为您进行所有“进入”和“离开”调用),或者在异步调用之前手动调用 dispatch_group_enter
并调用 dispatch_group_leave
在异步进程的完成处理程序中。
在这种情况下,因为您在调度块中调用异步任务,所以 dispatch_group_async
模式将不起作用。您希望在调用异步方法之前手动 dispatch_group_enter
,然后让完成处理程序调用 dispatch_group_leave
,正如您所做的那样。当每个“进入”都与“离开”相匹配时,该组将收到通知。而且因为您调用的方法已经是异步的,所以您根本不需要使用 dispatch_async
或 dispatch_group_async
。
因此,它可能看起来像:
dispatch_group_t group = dispatch_group_create();
dispatch_group_enter(group);
[self getCategoriesMainWithParameters:nil withSuccess:^(NSArray *objects) {
[categoriesMain addObjectsFromArray:objects];
dispatch_group_leave(group);
} failure:^(NSError *error) {
groupError = error;
dispatch_group_leave(group);
}];
dispatch_group_enter(group);
[self getCategoriesSubWithParameters:nil withSuccess:^(NSArray *objects) {
[categoriesSub addObjectsFromArray:objects];
dispatch_group_leave(group);
} failure:^(NSError *error) {
groupError = error;
dispatch_group_leave(group);
}];
dispatch_group_enter(group);
[self getCategoriesProductWithParameters:nil withSuccess:^(NSArray *objects) {
[categoriesProduct addObjectsFromArray:objects];
dispatch_group_leave(group);
} failure:^(NSError *error) {
groupError = error;
dispatch_group_leave(group);
}];
dispatch_group_notify(group,dispatch_get_main_queue(),^{
...
});
这是我第一次使用 dispatch_group_t
,我犯了一个简单的错误。 dispatch_group_notify
在任何异步调用返回之前被调用,因此甚至在第一个 dispatch_group_leave(group)
之前被调用,然后抛出 EXC_BAD_INSTRUCTION
。
但是,我不知道为什么会这样。
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{
[self getCategoriesMainWithParameters:nil withSuccess:^(NSArray *objects) {
[categoriesMain addObjectsFromArray:objects];
dispatch_group_leave(group);
} failure:^(NSError *error) {
groupError = error;
dispatch_group_leave(group);
}];
});
dispatch_group_async(group, queue, ^{
[self getCategoriesSubWithParameters:nil withSuccess:^(NSArray *objects) {
[categoriesSub addObjectsFromArray:objects];
dispatch_group_leave(group);
} failure:^(NSError *error) {
groupError = error;
dispatch_group_leave(group);
}];
});
dispatch_group_async(group, queue, ^{
[self getCategoriesProductWithParameters:nil withSuccess:^(NSArray *objects) {
[categoriesProduct addObjectsFromArray:objects];
dispatch_group_leave(group);
} failure:^(NSError *error) {
groupError = error;
dispatch_group_leave(group);
}];
});
dispatch_group_notify(group,dispatch_get_main_queue(),^{
...
});
函数dispatch_group_async
在调度块时自动“进入”组,并在调度块完成时自动“离开”。但是你再次调用 dispatch_group_leave
,所以你最终调用了太多的“离开”,导致你描述的错误。
应该调用 dispatch_group_async
(为您进行所有“进入”和“离开”调用),或者在异步调用之前手动调用 dispatch_group_enter
并调用 dispatch_group_leave
在异步进程的完成处理程序中。
在这种情况下,因为您在调度块中调用异步任务,所以 dispatch_group_async
模式将不起作用。您希望在调用异步方法之前手动 dispatch_group_enter
,然后让完成处理程序调用 dispatch_group_leave
,正如您所做的那样。当每个“进入”都与“离开”相匹配时,该组将收到通知。而且因为您调用的方法已经是异步的,所以您根本不需要使用 dispatch_async
或 dispatch_group_async
。
因此,它可能看起来像:
dispatch_group_t group = dispatch_group_create();
dispatch_group_enter(group);
[self getCategoriesMainWithParameters:nil withSuccess:^(NSArray *objects) {
[categoriesMain addObjectsFromArray:objects];
dispatch_group_leave(group);
} failure:^(NSError *error) {
groupError = error;
dispatch_group_leave(group);
}];
dispatch_group_enter(group);
[self getCategoriesSubWithParameters:nil withSuccess:^(NSArray *objects) {
[categoriesSub addObjectsFromArray:objects];
dispatch_group_leave(group);
} failure:^(NSError *error) {
groupError = error;
dispatch_group_leave(group);
}];
dispatch_group_enter(group);
[self getCategoriesProductWithParameters:nil withSuccess:^(NSArray *objects) {
[categoriesProduct addObjectsFromArray:objects];
dispatch_group_leave(group);
} failure:^(NSError *error) {
groupError = error;
dispatch_group_leave(group);
}];
dispatch_group_notify(group,dispatch_get_main_queue(),^{
...
});