據我所知,這些完成塊將分別被調用兩次,一次用於本地數據,第二次用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