38 votes

Plusieurs délégués dans Objective C

Je viens du modèle d'événement C # et je me demande s'il existe un moyen standard d'informer plusieurs délégués d'un événement?

J'ai un protocole ClassCDelegate que je veux que ClassA et ClassB implémentent. Existe-t-il un moyen de pouvoir affecter une instance de ClassC à la fois à ClassA et à ClassB en tant que délégués sans avoir à créer manuellement une liste de variables de délégué dans ClassC et à effectuer une itération à travers celles-ci?

73voto

Jeremy W. Sherman Points 22019

Cacao, les délégués sont utilisés pour réaliser l'inversion de contrôle et réduire la nécessité de sous-classement. Il est tout à fait possible d'avoir plusieurs délégués pour un objet unique, mais c'est fait quand il fait sens pour déléguer les différents types de décisions à différents objets. Un grand exemple de ceci est WebView de WebKit, qui a cinq délégués responsables des domaines aussi divers que les ressources de chargement et de navigation de la politique.

C#event–délégué système, qui permet à un objet de s'inscrire avec un autre objet à être averti lorsqu'un événement particulier se produit, est plus proche de la plusieurs de notification Api disponibles à partir de de Cacao. Les différentes Api vous pourriez courir à travers sont, de plus haut niveau au plus bas:

  • NSNotificationCenter
  • NSDistributedNotificationCenter
  • CFNotificationCenter
  • Darwin notifications.

Tous sont semblables dans l'esprit, je vais donc considérer seulement celui que vous souhaitez utiliser dans ce cas: NSNotificationCenter.

Les observateurs, tels que les ClassA et ClassB, enregistrer leurs intérêts dans les notifications NSNotificationCenter. Il est possible de spécifier un intérêt dans

  • les notifications avec un nom spécifique à partir d'un objet spécifique
  • les notifications avec un nom spécifique à partir de n'importe quel objet
  • notifications à partir d'un objet particulier.

Lorsqu'un correspondant, un avis est affiché au centre de notification, les observateurs sont notifiées par l'invocation de la méthode qu'ils ont fourni lors de votre inscription avec le centre de notification. La méthode a toujours le même type: il ne renvoie rien et accepte un seul argument, un NSNotification objet.

Vous serait généralement gérer votre situation par le fait d'avoir ClassC déclarer une constante pour le nom de notification dans son fichier d'en-tête, par exemple,

extern NSString *const ClassCSomethingDidHappenNotification;

Les observateurs intéressés, tels que les ClassA et ClassB, peuvent ensuite enregistrer intérêt dans cette notification:

[[NSNotificationCenter defaultCenter]
  addObserver:self
     selector:@selector(handleSomethingDidHappen:)
         name:ClassCSomethingDidHappenNotification                
       object:aClassCObject];

Au lieu de l'enregistrement d'un sélecteur et l'ajout d'une méthode à l'observateur pour gérer le rappel, vous pouvez également vous inscrire dès maintenant une opération de la file d'attente et un bloc à exécuter sur cette file d'attente lorsqu'un correspondant, un avis est affiché.

Lors de l'événement associé à la notification se produit, ClassC postes de la notification pour le centre de notification:

[[NSNotificationCenter defaultCenter]
  postNotificationName:ClassCSomethingDidHappenNotification
                object:self];

Le centre de notification sera alors regardez à travers la liste des observateurs, trouver ceux qui correspondent à cette notification, et appeler la méthode appropriée.

10voto

Jacob Jennings Points 1780

Une alternative au centre de notification consiste à utiliser une sous-classe NSProxy pour transférer les messages, détaillés dans la publication à l'adresse:

http://engineering.hoteltonight.com/handling-multiple-delegates-in-ios

La classe HTDelegateProxy est disponible à l'adresse suivante:

https://github.com/hoteltonight/HTDelegateProxy

3voto

vy32 Points 6298

Vous pouvez également demander à un objet de gérer l'événement, puis de le transférer à un autre objet.

3voto

Shaun Budhram Points 1365

Il est également important de noter que les notifications sont à sens unique: elles ne peuvent pas renvoyer d’informations comme les délégués. Le seul cas où vous voudriez parcourir la liste des délégués est si votre classe délégante attend des informations en retour de ses délégués.

2voto

Rob Keniger Points 32985

Vous ne pouvez avoir qu'un seul objet délégué. Si vous souhaitez notifier des modifications à divers objets, vous devez utiliser les messages NSNotificationCenter et post NSNotification que vos objets peuvent écouter.

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