0

我有两个完成调用的方法,并希望之后调用dispatch_group_notify块。这在第一次完成后有效,但不在第二次后。我需要在第二次通话后才能工作。dispatch_group_notify在第二次完成调用后

这里是我的代码:

method1WithCompletion:和method2WithCompletion:将有2个反应,首先,这将是与当地的数据,稍后,使请求的API,并返回API数据

dispatch_group_t requestGroup = dispatch_group_create(); 

    dispatch_group_enter(requestGroup); 
[self method1WithCompletion:^(NSArray *items) { 
//here I will get 2 responses (first from local storage, second from api) 
dispatch_group_leave(requestGroup); 
}]; 

    dispatch_group_enter(requestGroup); 
[self method2WithCompletion:^(NSArray *items) { 
//here I will get 2 responses (first from local storage, second from api) 
dispatch_group_leave(requestGroup); 
}]; 

// now this will only be called once the two "enter" calls are balanced with the corresponding "leave" calls 

dispatch_group_notify(requestGroup, dispatch_get_main_queue(), ^{ 
//completion 
//that should be called after method 1 and method 2 executed with local data,   and after they executed with api data 
}); 

不确定如何正确设置

+0

你是说这个完成块每次调用都会被调用两次吗?你的意思是“我会得到2个回答”? – Rob

回答

0

据我所知,这些完成块将分别被调用两次,一次用于本地数据,第二次用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); 
相关问题