2010-04-09 16 views
1

Je crée un objet MyOperation (hérité de NSOperation) et l'ajoute à un NSOperationQueue. Ensuite, je fais KVO sur MyOperation. J'utilise cette méthodeNSopération et observation de valeur de clé

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context; 

pour obtenir une valeur de MyOperation si elle est terminée. Dans cette méthode j'utilise une méthode de commodité d'une autre classe pour obtenir d'autres données.

Peut-être y a-t-il des problèmes de synchronisation dans la méthode observeValue ...?

Répondre

12

Je n'ai pas assez de réputation pour commenter ou voter, mais je voterais contre la réponse de dannywartnaby. NSOperation utilise intrinsèquement KVO dans son fonctionnement; la mise en œuvre de isFinished et isExecuted dans le cadre du traitement, par exemple, est 100% KVO et fait partie du contrat requis d'une opération avec un client/une file d'attente. Donc, conseiller que ceux-ci doivent être évités est inexact; NSOperation utilise KVO lui-même, donc l'adoption de la prémisse de dannywartnaby indiquerait que l'implémentation de NSOperation est elle-même erronée, ce qui n'est certainement pas le cas. Il est vrai que le développeur doit prendre soin d'utiliser KVO correctement, même si je dirais que sous-classer NSOperation est une tâche non triviale probablement laissée au programmeur Objective-C plus expérimenté. On pourrait argumenter que les notifications sont trop grossières pour le type de travail entrepris par une opération, mais pas toujours, je pense que nous devons être prudents lorsque nous conseillons sur les pratiques pour s'assurer que le mauvais message n'est pas adopté comme meilleure pratique. Danny, voudriez-vous expliquer pourquoi l'utilisation de KVO n'est pas conseillée lors de l'utilisation de NSOperation ou de threads? de nombreux exemples d'implémentation NSOperation utilisent KVO ...

+0

Merci pour cette réponse! –

+0

NSOpertation utilisant KVO dans son impl est un point discutable; Je ne dis pas que le KVO est mauvais, je dis qu'une notification est un meilleur choix. Les autres classes utilisant KVO ne rendent pas toutes les utilisations de KVO brusquement valides. Utiliser KVO pour cela vous lie exclusivement à des opérations, à la connaissance des keypaths, à devenir des observateurs qui à leur tour couplent vos deux classes ensemble. Une notification d'autre part est simple; postez-le dans votre opération, donnez-lui les données, et autre chose dans l'application ... – dannywartnaby

+0

Je vous suggère de lire à nouveau mon commentaire, je n'ai jamais dit ou laissé entendre qu'il "rend toutes les utilisations de KVO valides" Je viens de souligner que vous dire qu'il "n'est pas sage" d'utiliser le KVO est très trompeur. Pensez à toute occasion où vous utiliseriez le KVO par opposition aux notifications; Les notifications sont grossières et diffusées, KVO implique un couplage entre deux objets. Pensez au concept d'une opération, c'est un travail atomique, quelque chose le crée, et quelque chose va probablement devoir surveiller ce qu'il fait et quand c'est complet. si l'application a besoin de savoir ce qui se passe Notifier, si le client ne le fait, KVO – GilesB

-3

Je ne connais pas votre cas d'utilisation, mais utiliser KVO pour les threads/opérations n'est pas judicieux.

Vous pouvez avoir votre objet Operation à la place après avoir reçu une notification une fois qu'il est terminé. Ou bien définissez un protocole délégué et donnez un délégué à votre Opération ... vous pouvez alors définir une sorte de méthode 'myOperationComplete:' qui est invoquée par votre Opération contre le délégué qui lui a été donné, en utilisant performSelectorOnMainThread.

+1

Tout fonctionne bien avec KVO. Je veux juste les problèmes s'il y en a. Vous avez dit qu'il y a des problèmes. Pouvez-vous le préciser, quels sont ceux-là? –

+0

L'opération peut être annulée avant l'appel de "main". L'affichage d'une notification implique donc un travail supplémentaire dans certains cas. – Felix

+1

downvoted comme GilesB a souligné: NSOperation utilise KVO. – lulu