Método de disparo cuando el último bloque regresa

¿Cómo disparo un método cuando estoy seguro de que ambos códigos de bloque han regresado? Al igual que…

// Retrieve Messages Array from Parse [ParseManager retrieveAllMessagesForShnetworkingderUser:(ShnetworkingderUser *)[PFUser currentUser] withCompletionBlock:^(BOOL success, NSError *error, NSArray *objects){ self.messagesArray = objects; }]; // Retrieve MessagesPermissions Array from Parse [ParseManager retrieveAllMessagePermissionsForShnetworkingderUser:(ShnetworkingderUser *)[PFUser currentUser] withCompletionBlock:^(BOOL success, NSError *error, NSArray *objects){ self.messagePermissionsArray = objects; }]; -(void)methodToRunWhenBothBlocksHaveReturned{ } 

Si puede garantizar que los bloques se ejecutarán en el mismo subprocess (es decir, el subprocess de interfaz de usuario), entonces la alternativa es simple, utilizando una variable __block .

 -(void)yourMethod { __block int count = 0; [ParseManager retrieveAllMessagesForShnetworkingderUser:(ShnetworkingderUser *)[PFUser currentUser] withCompletionBlock:^(BOOL success, NSError *error, NSArray *objects){ self.messagesArray = objects; count++; if (count == 2) { [self methodToRunWhenBothBlocksHaveReturned]; } }]; [ParseManager retrieveAllMessagePermissionsForShnetworkingderUser:(ShnetworkingderUser *)[PFUser currentUser] withCompletionBlock:^(BOOL success, NSError *error, NSArray *objects){ self.messagePermissionsArray = objects; count++; if (count == 2) { [self methodToRunWhenBothBlocksHaveReturned]; } }]; } -(void)methodToRunWhenBothBlocksHaveReturned{ } 

Si no tiene la garantía del mismo hilo, puede usar un locking para asegurarse de que el incremento de la variable (y la comparación a 2) será atómico.