Cómo escribir un bloque de finalización de Objective-C

Estoy en una situación en la que necesito llamar a un método de clase desde mi controlador de vista, hacer que funcione, pero luego realizar algunas acciones SOLAMENTE DESPUÉS de que se haya completado el método de clase.

(Creo que lo que necesito es un bloque de finalización, pero corríjame si me equivoco).

Aquí está la situación:

Estoy usando Parse.com para mis aplicaciones. Cuando un usuario se registra en una cuenta, ingresa su nombre, compañía y otra información en una ventana emergente, luego hace clic en enviar. El botón de envío está vinculado a un método de clase (que se muestra a continuación) que toma su objeto PFUser y el nombre de la empresa y crea algunos objetos de base de datos. Una vez que se completa la función, la ventana emergente se cierra utilizando un delegado.

El problema es que necesito que la creación de estos objetos suceda en un orden específico porque dependen de la identidad de cada uno de los otros objetos. El problema es que el método de delegado para descartar la ventana emergente se llama inmediatamente después de hacer clic en enviar, ya que es el siguiente en la pila.

Al guardar un objeto Parse, se llama a un método que se parece a esto: (Esto es algo de lo que espero escribir y creo que resolvería mi problema)

[someParseObject saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
    // Code here runs AFTER the method completes.
    // This also happens on another thread which
    // I'd like to implement as well.
}];

Entonces, lo que necesito para averiguar cómo hacer algo como lo siguiente: (todo lo que tiene que ver con el bloqueo es completamente incorrecto, estoy seguro)

SignUpViewController.m

myUserOrg *userOrg = [myUserOrg object]; // myUserOrg = Custom PFObject Subclass

// My method that takes in a user object and a string, creates
// the database objects in order.
[userOrg registerNewUserOrgWithUser:(PFUser*) andCompanyName:(NSString*) companyName withBlock(somethingHere)block {

    if(error) {
        NSLog(@"Unable to create org!");
    } else {
        NSLog(@"Created Org!");
        [self.delegate dismissSignupView];
}

Por favor déjeme saber si necesita información adicional o aclaración.

¡Gracias de antemano!

--------- EDITAR UNO ----------

Muy bien, así que varias unidades de tiempo considerables más tarde, esto es lo que he encontrado. Toda la implementación podría simplificarse mejor y hacer muchas menos llamadas a la API, pero funcionará en eso. Varios otros problemas evidentes con él también, pero es un primer paso.

Método de llamada:

[testOrg registerNewUserOrgWithUser:currentUser
         creatingOrgContactWithName:@"MyBigHappy Corp."
                          withBlock:^(BOOL succeeded, NSError *error) {
                              if (error) {
                                  NSLog(@"Not working");
                              } else {
                                  NSLog(@"Working!");
                              }
                          }];

Implementación del método:

@implementation MYUserOrg

@dynamic orgContact;
@dynamic orgDisplayName;
@dynamic members;
@dynamic contacts;

+ (NSString *)parseClassName {
    return @"MYUserOrg";
}

dispatch_queue_t NewUserOrgRegistrationQueue;

-(void)registerNewUserOrgWithUser:(MYUser*)user
       creatingOrgContactWithName:(NSString*) orgContactName
                        withBlock:(MYBooleanResultBlock) block {

    NewUserOrgRegistrationQueue = dispatch_queue_create("com.myapp.initialOrgCreationQueue", NULL);

    dispatch_async(NewUserOrgRegistrationQueue, ^{

        NSMutableArray *errors = [[NSMutableArray alloc] init];

        // Initial org save to generate objectId
        NSError *orgSaveError = nil;
        [self save:&orgSaveError];

        if (orgSaveError) {
            [errors addObject:@"Initial Org save Failed"];
        }

        // Create and Relate Org Contact
        NSError *saveOrgContactError = nil;
        MYontact *orgContact = [MYContact object];
        [orgContact setContactType:MYContactTypeUserOrganization];
        [orgContact setDisplayName:orgContactName];
        [orgContact setParentOrg:self];
        [orgContact save:&saveOrgContactError];

        if (saveOrgContactError) {
            [errors addObject:@"Saving Org Contact Failed"];
        } else {
            // If Org contact saved, set it;
            [self setOrgContact:orgContact];
        }

        // Create amd Relate User Contact
        NSError *saveUserContactError = nil;
        MYContact *userContact = [MYContact object];
        [userContact setFirstName:user.firstName];
        [userContact setLastName:user.lastName];
        [userContact setContactType:MYcontactTypeUser];
        [userContact setParentOrg:self];
        [userContact save:&saveUserContactError];

        if (saveUserContactError) {
            [errors addObject:@"Saving user contact failed"];
        }

        NSError *saveUserError = nil;
        [user setParentOrg:self];
        [user setUserContact:userContact];
        [user save:&saveUserError];

        if (saveUserError) {
            [errors addObject:@"Saving User failed"];
        }

        // Return if block succeeded and any errors.
        NSError *error = nil;
        BOOL succeeded;
        if (errors.count > 0) {

            NSDictionary *userInfo = @{@"error" : errors};
            errors = [NSError errorWithDomain:@"MyAppErrorDomain"
                                         code:1
                                     userInfo:userInfo];
            succeeded = NO;
        } else {
            succeeded = YES;
        }
        block(succeeded, error);
    });

}

@end

Respuestas a la pregunta(4)

Su respuesta a la pregunta