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é. 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é. P> p>
6 Réponses :
On dirait que vous recherchez le motif d'observateur. Applique l'appelle " Notification ". P >
Pas vraiment ce que je cherche. Je ne veux pas être averti, je veux Ce fil i> à bloquer jusqu'à ce que MyObject soit chargé, mais mon code bloque MyObject d'être chargé du tout.
Si vous le pouvez, donnez la méthode de la classe A 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. P> MyObjected: code> 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. P>
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 P>
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];
nsnotification devrait résoudre le problème. P>
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. P>
Cette petite pêche a fonctionné pour moi (dans l'ordre de retarder 20 secondes) ....
CFRunLoopRunInMode(kCFRunLoopDefaultMode, 20.0, false);
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/...