2009-07-17 11 views
10

Soy bastante nuevo en Objective-C y no puedo entender cómo esperar sin bloqueos. Tengo un objeto que se está llenando de manera asíncrona y necesito esperar antes de poder continuar con otro método. En este momento estoy usando la función de suspensión, pero esto bloquea toda la aplicación y myObject nunca se carga.Función de espera sin bloqueo en Objective-C

while (!myObject) 
{ 
    sleep(1); 
} 
return myObject; 

EDIT: Este fragmento de código es de un método que puede ser llamado antes de myObject se ha cargado. En este caso, realmente quiero bloquear en este método, pero mi código bloquea todo, incluido myObject, para que no se cargue.

+0

Gracias a la respuesta de Chuck, me encontré con esta pregunta y ejecutado utilizando su segundo fragmento de código: http: //stackoverflow.com/questions/149646/best-way-to-make-nsrunloop-wait-for-a-flag-to-be-set –

Respuesta

6

Si puede, proporcione a la clase un método myObjectLoaded: que se invocará cuando se cargue el objeto en cuestión. De lo contrario, el equivalente más idiomático de lo que escribiste anteriormente es crear un temporizador que siga buscando myObject y haga algo una vez que lo encuentre.

Si realmente necesita hacerlo en medio de un método por alguna razón, tendría que crear un bucle que siga ejecutando el runloop. Es la falta de un runloop lo que hace que tu aplicación se bloquee.

0

Parece que está buscando el patrón de observador. Apple lo llama "notification".

+0

No es realmente lo que estoy buscando. No quiero recibir notificaciones, quiero que * este * thread esté bloqueado hasta que se cargue myObject, pero mi código impide que myObject se cargue. –

0

Eso es porque estás parando el hilo principal la espera de su objeto que se va a cargar. No hagas eso, porque el hilo principal es el hilo que impulsa la IU y espera la entrada del usuario. Si bloquea el hilo principal, bloquea la interfaz de usuario de la aplicación.

Si desea que el hilo principal de hacer algo cuando se carga el objeto, a continuación, crear un método myObjectLoaded: y llamar desde sus hilos de carga:

[myObjectController performSelectorOnMainThread:@selector(myObjectLoaded:) 
            withObject:myObject 
            waitUntilDone:NO]; 

donde myObjectController puede ser cualquier objeto, incluso MyObject sí.

3

NSNotification debería resolver el problema.

http://developer.apple.com/documentation/Cocoa/Conceptual/Notifications/Introduction/introNotifications.html

En lugar de esperar en el objeto, tienen este registro objeto de notificaciones procedentes de su otro objeto (digamos Editorial), que rellena los datos de forma asíncrona. Una vez que este objeto Publisher finaliza, haga que publique una NSNotification, que luego será recogido automáticamente por su objeto en espera. Esto eliminaría la espera también.

7

Este pequeño melocotón trabajó para mí (en el fin de retrasar durante 20 segundos) ....

CFRunLoopRunInMode(kCFRunLoopDefaultMode, 20.0, false);