2009-08-19 5 views
7

J'ai une application IPhone qui utilise des services web pour obtenir des données à partir d'un serveur. Je mets chaque appel au webservice dans une sous-classe NSOperation afin qu'il puisse être threadé. Ma question est, quelle est la manière recommandée de passer l'information d'une sous-classe de NSOperation accomplie. J'envoie actuellement un NSNotification à la fin de ma méthode principale et tout code qui attend la fin de NSOperation, s'abonne à la notification. Et puis j'utiliserai la partie objet de NSNotificationWithName: Object: pour renvoyer des informations de l'opération.Cocoa - Retour d'informations de NSOperation

Je ne savais pas s'il y avait une meilleure façon de le faire. J'ai entendu parler de Key Value Coding et ensuite je pourrais utiliser Key Value Observing pour détecter quand la propriété isFinished pour l'opération est modifiée, mais je ne suis pas sûr de la meilleure pratique. J'essaie également de m'assurer que mon application est sûre pour les threads, ce qui ne serait pas un problème, du moment que ma notification a été envoyée à la fin de la méthode principale, donc l'objet dans la notification serait ne plus être utilisé dans le fil car il se terminera.

Enfin, je fais appel à la notification comme ceci:

[[NSNotificationCenter defaultCenter] performSelectorOnMainThread:@selector(postNotification:) withObject:[NSNotification notificationWithName:@"notificationName" object:dataObject] waitUntilDone:NO]; 

Répondre

16

J'ai personnellement fait cela de deux façons. Les deux ont très bien fonctionné.

Première voie

Vous pouvez avoir une fonction qui renvoie la « sortie », et que vous appelez cette fonction après l'opération terminée. Vous pouvez observer la clé isFinished sur l'objet NSOperation ou utiliser -[NSOperationQueue waitUntilAllOperationsAreFinished] pour déterminer quand l'opération est terminée.

Second Way

Vous pouvez utiliser un délégué ou cible/action à partir du NSOperation. Assurez-vous que lorsque vous appelez la fonction délégué, ou déclenchez la cible/action, vous le faites sur le thread principal en utilisant -[NSObject performSelectorOnMainThread:withObject:waitUntilDone:]

1

Cela dépend de votre application. Combien d'opérations prévoyez-vous exécuter simultanément? Que faites-vous avec le résultat? Les résultats sont-ils agrégés ou doivent-ils être affichés immédiatement dans l'interface utilisateur?

Les notifications d'envoi sur le thread principal sont assez lourdes. En fonction de ce que vous faites avec le résultat, vous pourriez étouffer votre interface utilisateur. Du point de vue de la conception, les objets que vous enverriez à partir de la notification sont-ils quelque chose que la classe observatrice devrait connaître? Il peut être plus judicieux d'apporter des modifications à vos objets de modèle à partir de l'opération et de faire en sorte qu'un objet contrôleur les observe à la place.

Vous pouvez utiliser l'observation des valeurs clés mais vous devez faire attention. L'observateur observe dans le même thread que la modification se produit, vous ne devez donc pas modifier directement l'interface utilisateur lorsque vous observez isFinished.

Si l'objet est uniquement détenu et utilisé par l'opération, alors oui, il devrait être sûr d'envoyer à la fin de la main. Il sera conservé par la notification.

0

Le doc dit qu'il est préférable de rendre la variable membre d'opération quand vous voulez obtenir le résultat de opération. Mais je ne pense pas que la solution vous adaptera.

Je pense que la notification est bonne et il y a une autre façon d'obtenir le résultat est de faire un bloc d'achèvement pour votre propre opération.Voir ici: Return data from NSOperation? J'ai essayé c'est bien travail.

J'ai essayé d'une autre manière avant de mettre le bloc de fin d'opération, et de faire une référence faible à l'opération et de faire du résultat une propriété de fonctionnement. ainsi vous pouvez obtenir le résultat d'opération quand vous avez fini.

Mais l'achèvement n'est pas fiable, lorsque vous annulez l'opération, la complétion est également effectuée. alors choisissez le meilleur pour vous.

+0

le document est vous pouvez l'aimer. – frank