据我所知,这些完成块将分别被调用两次,一次用于本地数据,第二次用API数据。并且您希望在两个本地呼叫完成时调用notify块,并在两次API调用完成时再次呼叫。
要做到这一点,你需要两个调度组,你可以这样做:
dispatch_group_t requestGroupLocal = dispatch_group_create();
dispatch_group_t requestGroupAPI = dispatch_group_create();
dispatch_group_enter(requestGroupLocal);
dispatch_group_enter(requestGroupAPI);
__block NSInteger count1 = 0;
[self method1WithCompletion:^(NSArray *items) {
if (count1 == 0) {
dispatch_group_leave(requestGroupLocal);
count1++;
} else {
dispatch_group_leave(requestGroupAPI);
}
}];
dispatch_group_enter(requestGroupLocal);
dispatch_group_enter(requestGroupAPI);
__block NSInteger count2 = 0;
[self method2WithCompletion:^(NSArray *items) {
if (count2 == 0) {
dispatch_group_leave(requestGroupLocal);
count2++;
} else {
dispatch_group_leave(requestGroupAPI);
}
}];
dispatch_block_t completion = ^{
// do whatever you want when each group finishes
};
dispatch_group_notify(requestGroupLocal, dispatch_get_main_queue(), completion);
dispatch_group_notify(requestGroupAPI, dispatch_get_main_queue(), completion);
或者,更好的,而不是依靠那些神秘的柜台,你可以添加一个参数,以块指示无论是本地电话与否:
dispatch_group_t requestGroupLocal = dispatch_group_create();
dispatch_group_t requestGroupAPI = dispatch_group_create();
dispatch_group_enter(requestGroupLocal);
dispatch_group_enter(requestGroupAPI);
[self method1WithCompletion:^(NSArray *items, BOOL isLocal) {
if (isLocal) {
dispatch_group_leave(requestGroupLocal);
} else {
dispatch_group_leave(requestGroupAPI);
}
}];
dispatch_group_enter(requestGroupLocal);
dispatch_group_enter(requestGroupAPI);
[self method2WithCompletion:^(NSArray *items, BOOL isLocal) {
if (isLocal) {
dispatch_group_leave(requestGroupLocal);
} else {
dispatch_group_leave(requestGroupAPI);
}
}];
dispatch_block_t completion = ^{
// do whatever you want when each group finishes
};
dispatch_group_notify(requestGroupLocal, dispatch_get_main_queue(), completion);
dispatch_group_notify(requestGroupAPI, dispatch_get_main_queue(), completion);
坦率地说,在调用完成处理的这个图案两次是相当典型,是有点怀疑。我可以想象当前设计背后的意图,但我会倾向于退休。相反,我宁愿看到本地和API引渡其称他们完成处理程序只有一次单独的方法:
dispatch_group_t requestGroupLocal = dispatch_group_create();
dispatch_group_enter(requestGroupLocal);
[self methodLocal1WithCompletion:^(NSArray *items) {
dispatch_group_leave(requestGroupLocal);
}];
dispatch_group_enter(requestGroupLocal);
[self methodLocal2WithCompletion:^(NSArray *items) {
dispatch_group_leave(requestGroupLocal);
}];
dispatch_group_t requestGroupAPI = dispatch_group_create();
dispatch_group_enter(requestGroupAPI);
[self methodAPI1WithCompletion:^(NSArray *items) {
dispatch_group_leave(requestGroupAPI);
}];
dispatch_group_enter(requestGroupAPI);
[self methodAPI2WithCompletion:^(NSArray *items) {
dispatch_group_leave(requestGroupAPI);
}];
dispatch_block_t completion = ^{
// do whatever you want when each group finishes
};
dispatch_group_notify(requestGroupLocal, dispatch_get_main_queue(), completion);
dispatch_group_notify(requestGroupAPI, dispatch_get_main_queue(), completion);
或者,如果你真的想为方法1和2只有一个方法,然后进行local
参数,但是再次写入只能调用其完成处理程序的方法一次:
dispatch_group_t requestGroupLocal = dispatch_group_create();
dispatch_group_enter(requestGroupLocal);
[self method1Local:true completion:^(NSArray *items) {
dispatch_group_leave(requestGroupLocal);
}];
dispatch_group_enter(requestGroupLocal);
[self method2Local:true completion:^(NSArray *items) {
dispatch_group_leave(requestGroupLocal);
}];
dispatch_group_t requestGroupAPI = dispatch_group_create();
dispatch_group_enter(requestGroupAPI);
[self method1Local:false completion:^(NSArray *items) {
dispatch_group_leave(requestGroupAPI);
}];
dispatch_group_enter(requestGroupAPI);
[self method2Local:false completion:^(NSArray *items) {
dispatch_group_leave(requestGroupAPI);
}];
dispatch_block_t completion = ^{
// do whatever you want when each group finishes
};
dispatch_group_notify(requestGroupLocal, dispatch_get_main_queue(), completion);
dispatch_group_notify(requestGroupAPI, dispatch_get_main_queue(), completion);
来源
2015-12-03 17:29:07
Rob
你是说这个完成块每次调用都会被调用两次吗?你的意思是“我会得到2个回答”? – Rob