Realización de operaciones de bloque en objects en set y completando cuando se completa

Tengo una variedad de objects en los que me gustaría realizar operaciones de bloque. No estoy seguro de la mejor manera de hacerlo. Estoy haciendo algo como en el código a continuación, pero no creo que esta sea la mejor práctica. ¿Cuál es la mejor manera de hacer tal operación?

- (void)performBlockOnAllObjects:(NSArray*)objects completion:(void(^)(BOOL success))completionHandler { NSInteger counter = objects.count; for (MyObject *obj in objects) { [obj performTaskWithCompletion:^(NSError *error) { counter--; if (counter == 0) { completionHandler(YES); } }]; } } 

Por lo general, usaría grupos de envío para esto. Usted "ingresa" al grupo antes de llamar a su método, se "deja" en el manejador de finalización y luego especifica un bloque que debe llamarse cuando el grupo le notifica que todas las llamadas "entrando" se han compensado con llamadas "dejadas".

 - (void)performBlockOnAllObjects:(NSArray*)objects completion:(void(^)(BOOL success))completionHandler { dispatch_group_t group = dispatch_group_create(); for (MyObject *obj in objects) { dispatch_group_enter(group); [obj performTaskWithCompletion:^(NSError *error) { dispatch_group_leave(group); }]; } dispatch_group_notify(group, dispatch_get_main_queue(), ^{ completionHandler(YES); }); } 

Este es el patrón típico para especificar un bloque de código que se llamará de forma asíncrona cuando se completa una serie de otras tareas asíncronas.