es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

En Objective-C, si tengo una llamada a un bloque en un método que devuelve un valor, ¿cómo devuelvo el valor después de que se haya ejecutado el bloque?

Por favor, considere este código de muestra:

- (long)someMethod {

   long returnValue;

   [MFPDFConverter createPDFFromEmail:emailToConvert completionHandler:^(long longObtainedFromBlock) {
        NSLog(@"Aquí estamos");
        returnValue = longObtainedFromBlock;        
   }];

   return returnValue;

}

¿Cómo puedo refactorizar el método para que espere a que el bloque termine antes de devolver el valor? Gracias por su atención.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para esperar a que el bloque termine antes de devolver el valor, podemos utilizar un método de envío síncrono como dispatch_semaphore_wait(). Este método crea un semáforo que puede ser utilizado para bloquear un hilo hasta que se recibe una señal de otro hilo.

    Aquí hay un ejemplo de cómo refactorizar el código utilizando este método:

    - (long)someMethod {
    
       __block long returnValue;
       dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    
       [MFPDFConverter createPDFFromEmail:emailToConvert completionHandler:^(long longObtainedFromBlock) {
            NSLog(@"Here we are");
            returnValue = longObtainedFromBlock;
            dispatch_semaphore_signal(semaphore);
       }];
    
       dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
       return returnValue;
    
    }
    

    En esta versión del método, creamos un semáforo y establecemos su valor inicial en 0. Luego modificamos el controlador de finalización para señalar el semáforo utilizando dispatch_semaphore_signal() una vez que se ha obtenido el valor long. Finalmente, esperamos a que el semáforo sea señalado usando dispatch_semaphore_wait() antes de devolver el valor long.

    Al utilizar un semáforo, nos aseguramos de que el método bloquee hasta que se haya completado el controlador de finalización y evitamos devolver un valor indefinido.

Comments are closed.