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.
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:
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 valorlong
. Finalmente, esperamos a que el semáforo sea señalado usandodispatch_semaphore_wait()
antes de devolver el valorlong
.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.