La configuration: J'ai un objet gestionnaire d'accès aux données singleton, appelez-le gestionnaire. J'ai aussi des contrôleurs de vue, appelez les pommes et les oranges. Les pommes et les oranges utilisent le gestionnaire pour certaines fonctionnalités de modèle/accès de données partagées.Comment avoir plusieurs délégués pour un objet sans trop lui donner de connaissances sur le domaine?
Je voudrais appeler directeur soit de les remettre dans certains cas, selon quelque chose comme ceci:
if (someCondition)
[self.applesDelegate callSomething];
else if (otherCondition)
[self.orangesDelegate callSomething];
Je vois trois façons de mettre en œuvre ce, rien dont je suis satisfait.
1) faites exactement ce que j'ai fait ci-dessus, donnez à Manager certaines propriétés comme applesDelegate et orangesDelegate, et les contrôleurs de vues concernés s'enregistrent pour cela. Mais ce serait mauvais parce que le gestionnaire aurait une connaissance du domaine, et je ne veux pas avoir cela. Le gestionnaire ne devrait rien savoir sur les objets Apple ou Orange.
2) avoir une carte de délégués dynamique. Gestionnaire aurait quelque NSMutableDictionary pour les délégués et les pommes et les oranges ferait quelque chose comme
[manager.delegateMap setObject:self forKey:@"applesDelegate"];
Et gestionnaire, quand il aurait besoin d'appeler les délégués, ferait quelque chose comme
if (someCondition) {
[[delegatemap objectForKey:@"applesDelegate"] callSomeMethod];
}
Cela semble réalisable, mais étrange. Et je ne suis pas sûr comment cela fonctionnerait avec l'exigence commune de dealloc de mettre le délégué à zéro quand vous n'avez pas une propriété de délégué mais ce genre d'indirection.
3) abandonner complètement l'idée de délégués et utiliser des notifications à la place. Manager générerait simplement des notifications et Apple et Oranges les écouteraient. Cela perd beaucoup de vérifications au moment de la compilation, c'est pourquoi je pense toujours aux délégués qui ont un couplage un peu plus serré.
Lequel des trois recommanderiez-vous ici? Ou peut-être quelque chose de différent?
Merci. Cette table de recherche/répartition est ce que j'avais en tête. La seule raison pour laquelle j'hésite à implémenter ceci est qu'Objective-C a des règles claires sur la façon dont un délégué devrait libérer ses "enfants" une fois qu'il disparaît, et il est moins clair comment cela fonctionnerait dans cette table de recherche. situation. (Je sais que vous avez dit que vous ne parlez pas cette langue, j'espère que quelqu'un d'autre peut intervenir.) – Jaanus