web-dev-qa-db-fra.com

KVO vs NSNotification vs protocole / délégués?

J'ai une idée de laquelle utiliser quand mais l'utilisation exacte n'est toujours pas claire pour moi. Quelqu'un peut-il expliquer avec l'exemple?

36
Ankit Srivastava

Utilisez un délégué si vous ne souhaitez parler qu'à un seul objet. Par exemple, une tableView a un délégué - un seul objet devrait être responsable de sa gestion.

Utilisez les notifications si vous souhaitez informer tout le monde que quelque chose s'est passé. Par exemple, dans les situations de mémoire insuffisante, une notification est envoyée pour informer votre application qu'il y a eu un avertissement de mémoire. Étant donné que de nombreux objets de votre application peuvent souhaiter réduire leur utilisation de la mémoire, il s'agit d'une notification.

Je ne pense pas que KVO soit une bonne idée du tout et essayez de ne pas l'utiliser, mais si vous voulez savoir si une propriété a changé, vous pouvez écouter les changements.

J'espère que cela pourra aider.

PS Cela résume pourquoi je pense que KVO est cassé

40
deanWombourne

Utilisez un délégué lorsqu'il y a une relation "maître/esclave" (le délégué connaît la classe et la classe connaît le délégué), avec une classe plus haut dans la hiérarchie de contrôle, et lorsqu'il est clair qu'il n'y aura pas de situations où d'autres Les éléments (principalement l'interface utilisateur) seront intéressés à savoir ce que la classe a à dire.

Utilisez les notifications lorsque la classe n'est pas intéressée de savoir qui écoute et combien ils sont, n'importe qui et n'importe quel nombre peut s'inscrire aux notifications.

KVO est utile pour écouter "à l'insu de la classe", bien que ce ne soit évidemment pas le cas, la classe sur laquelle KVO est appliqué n'a pas besoin d'être modifiée.

14
jbat100

Même lorsque les trois répondraient à vos besoins dans une situation, le délégué serait toujours une option préférée:

  1. Réutilisabilité.
  2. Auto documenté. En examinant le fichier d'en-tête de la classe, on reconnaîtrait immédiatement quoi/comment les données échangées ont lieu.
2
user523234

La délégation est un modèle de conception que vous utilisez lorsque vous souhaitez qu'un autre objet modifie le comportement de l'expéditeur. Exemple: les fenêtres du terminal évitent d'afficher des lignes ou des caractères qui sont coupés par les bords de la fenêtre, car le délégué de la fenêtre du terminal modifie la taille de la fenêtre pour garantir cela.

La notification est un modèle à utiliser lorsque vous n'avez pas besoin de réponse. Exemple: vous recevez une notification indiquant que le système est sur le point de s'endormir. L'expéditeur de cette notification ne se soucie pas de ce que vous en faites.

2
NSResponder

À mon avis, KVO est meilleur en raison de ses avantages sans frais généraux. Les notifications ont une surcharge même si vous ne les utilisez pas/ne les observez pas. Pour améliorer cela, vous pouvez utiliser différents NotificationCenters, mais même avec cela, des frais généraux seront présents (corrigez-moi si je me trompe). KVO est peu complexe mais ça vaut le coup quand vous devez observer beaucoup de choses.

1
MANN