14 votes

Quelle est la meilleure façon de faire des observateurs/observables en Objective-C (version iphone) ?

J'ai l'habitude de coder des interfaces utilisateur Java Swing, et dans celles-ci, si vous avez des propriétés qui changent et que vous voulez que votre interface utilisateur soit mise à jour, vous implémentez le modèle observateur/observable. En Java, vous faites cela normalement en faisant en sorte que votre classe maintienne une liste d'écouteurs qu'elle notifie de différents événements.

J'ai joué avec Objective-C sur le Mac, et cela a KVC et la liaison qui semble fonctionner très bien, et nécessite moins de code. Le SDK de l'iPhone ne semble pas disposer de cette fonctionnalité, et ma question est donc la suivante : Si j'ai une classe qui contient des données qui changent, quel est le meilleur moyen pour moi d'enregistrer un composant d'interface utilisateur avec cette classe afin qu'il puisse être informé des changements dans les données qu'il doit afficher ?

37voto

Chris Hanson Points 34485

Il existe deux méthodes intégrées d'observation dans Cocoa : l'observation clé-valeur et les notifications. Dans ces deux systèmes, vous n'avez pas besoin de maintenir ou de notifier vous-même une collection d'observateurs ; le framework s'en charge pour vous.

La fonction Key-Value Observing (KVO) vous permet d'observer une propriété d'un objet - y compris même une propriété représentant une collection - et d'être informé des modifications apportées à cette propriété. Il vous suffit d'envoyer l'objet -addObserver:forKeyPath:options:context: en passant l'objet dont vous voulez recevoir les mises à jour, le chemin clé de la propriété (par rapport au récepteur) pour laquelle vous voulez recevoir les mises à jour, et les types de mises à jour que vous voulez recevoir. (Il existe des méthodes similaires que vous pouvez utiliser si vous voulez observer une propriété représentant une collection).

Les notifications sont plus anciennes et plus lourdes. Vous vous inscrivez auprès d'un NSNotificationCenter - généralement le centre par défaut - une paire d'objet et de sélecteur à qui l'on transmet une notification lorsqu'un événement se produit. L'objet de notification lui-même peut contenir des données arbitraires via sa fonction userInfo et vous pouvez choisir d'observer toutes les notifications d'un nom spécifique plutôt que celles qui s'appliquent à un objet particulier.

Lequel devez-vous utiliser dans un cas particulier ? En général, si vous vous intéressez aux modifications apportées à une propriété spécifique d'un objet spécifique, utilisez l'observation clé-valeur. C'est pour cela qu'elle a été conçue et elle est intentionnellement légère. () Si vous vous intéressez à un changement d'état qui n'est pas représenté par une propriété, les notifications sont plus appropriées.

Par exemple, pour rester synchronisé lorsque l'utilisateur change le nom d'un objet du modèle, j'utiliserais KVO. Pour savoir quand un graphique d'objets entier a été sauvegardé, j'utiliserais les notifications.

9voto

rustyshelf Points 16336

J'ai aussi découvert que vous pouvez le faire :

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_handleWhateverChange) name:@"whateverChange" object:nil];

Pour vous inscrire aux événements de changement, et

[[NSNotificationCenter defaultCenter] postNotificationName:@"whateverChange" object:nil];

Pour les virer. Je suis peut-être un N00b mais je n'ai pas réussi à faire fonctionner le truc de l'observateur pour le chemin des clés.

0voto

Mark Bessey Points 13931

Ce n'est pas la façon dont on procède généralement. Jetez un coup d'œil à la discussion aquí en particulier le lien vers la documentation d'Apple.

Si vous voulez toujours le faire de la manière dont vous le dites, il n'est pas particulièrement difficile d'implémenter quelque chose comme les bindings "à la main". Il suffit de créer un objet "binding" qui sait comment s'abonner aux changements et se connecte à une propriété d'une vue.

Pour répondre à la question de savoir comment cela se passe, vous avez normalement un objet contrôleur qui surveille l'état du modèle (agissant comme un observateur) et met à jour les objets de vue si nécessaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X