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.