Estoy escribiendo un módulo iOS que actualmente envía un correo electrónico de forma asincrónica (usando delegados). Utiliza SKPSMTPMessage
que funciona muy bien. Mi problema es que el cliente quiere que el código bloquee completamente el hilo hasta después de que se haya enviado (o no se haya enviado). Por lo tanto, básicamente están solicitando una solución sincrónica, cuando actualmente intentará enviar el correo electrónico y luego regresar de ese bloque de código antes de que se haya enviado el correo electrónico.¿Envolviendo llamadas asincrónicas en un hilo de bloqueo síncrono?
Así que, en lugar de tratar de reescribir el código SKPSMTPMessage
de forma síncrona (no parece que haya ninguna opción síncrona para él), espero encontrar la forma de ajustar ese bloque de código asíncrono en su propio hilo y tal vez hacer que el hilo principal espere hasta que finalice por completo (delegados y todo).
He probado unos cuantos métodos diferentes usando NSOperation
s y NSThread
pero tal vez no lo estoy haciendo algo bien, porque cada vez que intento de bloquear el hilo principal, el delegado asincrónica llama todavía nunca parecen terminar (hacer que vuelvan en el hilo principal o algo así?).
Cualquier información o incluso otras ideas apreciadas.
PD ~ Me doy cuenta de que esto es un poco al revés. En la mayoría de los casos, asíncrono parece ser el camino a seguir, pero este es un caso especial y el cliente tiene sus razones para quererlo.
EDIT: Gracias por toda la contribución. Tal y como sugiere una de las respuestas, Acabé usando un bucle while que esperó a que los delegados a regresar todavía permiten la Runloop continuar así de este modo:
while(![messageDelegate hasFinishedOrFailed]){
// Allow the run loop to do some processing of the stream
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];
}
Sí, eso parece ser más y más lo que tengo que hacer y, sin embargo, el código se distribuye a través de varios métodos. Puedo decir que tratar de mover las cosas de manera que todo ocurra sincrónicamente va a ser un dolor. Parece que si de alguna manera tomo el trabajo runLoop fuera de la ecuación, eso ayudaría. Supongo que esperaba simplemente envolver el bloque de código en un hilo separado ... ¿entonces el lazo de ejecución no se ejecutaría en ese hilo y no en el hilo principal? No parece ser el caso, aunque – valheru
Gracias, pero como publiqué como un comentario a otra posible respuesta, el módulo no debería tener ningún acceso a la interfaz de usuario en sí, ya que se incluirá en aplicaciones separadas. Se supone que es más un proceso en segundo plano en sí mismo que simplemente se inicia cuando la aplicación se inicia y, cuando termina, le da control total a la aplicación. – valheru
Si crea un nuevo hilo, el ciclo de ejecución no se ejecuta automáticamente; tiene que iniciarse manualmente. Creo que poner la mensajería en segundo plano es la única posibilidad, sin embargo. Ver mi actualización para una posible forma de hacer eso. –