10
votes

Fonction d'attente non bloquante dans l'objectif-c

Je suis assez nouveau à Objective-C et je ne peux pas comprendre comment attendre de manière non bloquante. J'ai un objet qui est peuplé de manière asynchrone et je dois l'attendre avant que je puisse continuer dans une autre méthode. En ce moment, j'utilise la fonction de sommeil, mais cela bloque l'application entière et MyObject jamais chargé. XXX

EDIT: Cet extrait de code provient d'une méthode pouvant être appelée avant que MyObject ait été chargé. . Dans ce cas, je veux réellement bloquer dans cette méthode, mais mon code bloque tout, y compris MyObject d'être chargé.


1 commentaires

Grâce à la réponse de Chuck, j'ai trouvé cette question et j'ai implémenté-la à l'aide de son deuxième extrait de code: Stackoverflow.com/questions/149646/...


6 Réponses :


0
votes

On dirait que vous recherchez le motif d'observateur. Applique l'appelle " Notification ".


1 commentaires

Pas vraiment ce que je cherche. Je ne veux pas être averti, je veux Ce fil à bloquer jusqu'à ce que MyObject soit chargé, mais mon code bloque MyObject d'être chargé du tout.



6
votes

Si vous le pouvez, donnez la méthode de la classe A MyObjected: lorsque l'objet en question est chargé. Sinon, l'équivalent le plus idiomatique de ce que vous avez écrit ci-dessus est de créer une minuterie qui continue à vérifier MyObject et fait quelque chose une fois qu'elle le trouve.

Si vous aviez vraiment besoin de le faire au milieu d'une méthode pour une raison quelconque, vous devez créer une boucle qui continue à exécuter l'exécution. C'est l'absence d'une runloop qui fait bloquer votre application.


0 commentaires

0
votes

En supposant que vous avez des antécédents NSThread effectuant cette opération de la population, vous pouvez aimer la méthode NsObject SPRESSelector: ONTHEAD: withObject: WAITUNTDONE


0 commentaires

0
votes

C'est parce que vous arrêtez le fil principal en attente de chargement de votre objet. Ne faites pas cela, car le thread principal est le fil qui conduit l'interface utilisateur et attend la saisie de l'utilisateur. Si vous bloquez le thread principal, vous bloquez l'interface utilisateur de l'application.

Si vous voulez que le fil principal fasse quelque chose lorsque l'objet est chargé, créez une méthode MyObjectLoaded: et appelez à partir de vos filets de chargement: P>

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


0 commentaires

3
votes

nsnotification devrait résoudre le problème.

http://developer.apple.com/documentation /Cocoa/conceptuel/notiformations/introduction/Intonotifications.html

au lieu d'attendre sur l'objet, vous devez vous inscrire à cet objet pour les notifications provenant de votre autre objet (par exemple, éditeur) qui remplit les données de manière asynchrone. L'un que cet objet éditeur finit, a-t-il posté une NSnotification, qui sera ensuite automatiquement prise en charge par votre objet d'attente. Cela éliminerait aussi l'attente.


0 commentaires

10
votes

Cette petite pêche a fonctionné pour moi (dans l'ordre de retarder 20 secondes) ....

CFRunLoopRunInMode(kCFRunLoopDefaultMode, 20.0, false);


0 commentaires