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); 
相關問題