L'expansion sur Jörn Eyrich réponse (upvote sa réponse si vous upvote celui-ci), si vous n'avez pas de contrôle sur l' dispatch_async
des appels pour vos blocs, comme ce pourrait être le cas pour async achèvement des blocs, vous pouvez utiliser le PGCD des groupes à l'aide de dispatch_group_enter
et dispatch_group_leave
directement.
Dans cet exemple, nous allons faire semblant computeInBackground
est quelque chose que nous ne pouvons pas changer (imaginez que c'est un délégué de rappel, NSURLConnection completionHandler, ou quoi que ce soit), et donc nous n'avons pas accès à la répartition des appels.
// create a group
dispatch_group_t group = dispatch_group_create();
// pair a dispatch_group_enter for each dispatch_group_leave
dispatch_group_enter(group); // pair 1 enter
[self computeInBackground:1 completion:^{
NSLog(@"1 done");
dispatch_group_leave(group); // pair 1 leave
}];
// again... (and again...)
dispatch_group_enter(group); // pair 2 enter
[self computeInBackground:2 completion:^{
NSLog(@"2 done");
dispatch_group_leave(group); // pair 2 leave
}];
// Next, setup the code to execute after all the paired enter/leave calls.
//
// Option 1: Get a notification on a block that will be scheduled on the specified queue:
dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
NSLog(@"finally!");
});
// Option 2: Block an wait for the calls to complete in code already running
// (as cbartel points out, be careful with running this on the main/UI queue!):
//
// dispatch_group_wait(group, DISPATCH_TIME_FOREVER); // blocks current thread
// NSLog(@"finally!");
Dans cet exemple, computeInBackground:achèvement: est implémenté sous la forme:
- (void)computeInBackground:(int)no completion:(void (^)(void))block {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
NSLog(@"%d starting", no);
sleep(no*2);
block();
});
}
De sortie (avec des horodatages à partir d'une série):
12:57:02.574 2 running
12:57:02.574 1 running
12:57:04.590 1 done
12:57:06.590 2 done
12:57:06.591 finally!