Recientemente estuve dando vueltas con una aplicación de muestra que intentaba poner mi cabeza completamente alrededor de NSRunLoop
. La muestra que escribí creó un hilo secundario simple a través de NSOperation
. El hilo secundario realiza algunas tareas, como procesar un NSTimer
y también una transmisión rudimentaria con NSStream
. Ambas fuentes de entrada requieren un NSRunLoop
correctamente configurado para poder ejecutar.NSRunLoop del subproceso principal al que se hace referencia en un subproceso secundario
Mi pregunta es esta. Originalmente tenía un código que se veía así en el hilo secundario:
NSRunLoop* myRunLoop = [NSRunLoop currentRunLoop];
self.connectTimer = [NSTimer scheduledTimerWithTimeInterval:connectTimeout
target:self
selector:@selector(connectionConnectedCheck:)
userInfo:nil
repeats:NO];
[myRunLoop addTimer:self.connectTimer forMode:NSDefaultRunLoopMode]; // added source here
[myRunLoop run];
[NSStream getStreamsToHostNamed:relayHost port:relayPort inputStream:&inputStream outputStream:&outputStream];
if ((inputStream != nil) && (outputStream != nil))
{
sendState = kSKPSMTPConnecting;
isSecure = NO;
[inputStream retain];
[outputStream retain];
[inputStream setDelegate:self];
[outputStream setDelegate:self];
[inputStream scheduleInRunLoop: myRunLoop //[NSRunLoop currentRunLoop]
forMode:NSRunLoopCommonModes];
[outputStream scheduleInRunLoop: myRunLoop //[NSRunLoop currentRunLoop]
forMode:NSRunLoopCommonModes];
[inputStream open];
[outputStream open];
self.inputString = [NSMutableString string];
return YES;
}
Ahora, con el código anterior, los eventos nunca lo haría proceso. No en currentRunLoop
. Hice algo terrible después, ya que era solo un ejercicio educativo, y lo modifiqué para ejecutarlo bajo NSRunLoop
mainRunLoop
. Funcionó como magia. Sin embargo, estoy casi seguro de que, dependiendo de mis hilos principales, el ciclo de ejecución en un hilo secundario está en 10 niveles diferentes de incorrecto.
Así que mi pregunta es en dos partes, y espero que esté bien.
¿Qué puede ir mal con el pequeño 'hackear' que aplica el fin de obtener el subproceso secundario para funcionar y responder a eventos a través del bucle de ejecución?
¿Cuál es la forma correcta de configurar el subproceso secundario para escuchar a todos los eventos/fuentes basadas en temporizador, así que no tienen que hacer el paso 1.
Gracias por toda la visión.
De hecho, lo he intentado. Sin suerte. El código solo se ejecutará si se ejecutó con [NSRunLoop mainRunLoop] –