2010-07-30 5 views
0

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?

Répondre

1

Dans certains cas, un modèle de chaîne de responsabilité est utile. Chaque délégué est capable de déterminer s'il peut faire la tâche. Je ne me sens que rarement à l'aise avec cette diffusion de la responsabilité à travers les délégués.

Donc normalement je chercherais quelque chose comme votre option 2. En fait, vous construisez une table de répartition. Dans la mesure du possible, j'essaierais de refondre les conditions en quelque chose qui peut être recherché dans une table. Donc, en effet, nous prenons des informations et récupérer un objet et une méthode

 whatToDo = lookup(condition definition) 

     whatToDo[who].what 

(excuses pour le manque de syntaxe, je ne parle pas votre langue, j'espère que les concepts se traduisent - je pouvais faire ceci en JavaScript, ou avec des pointeurs de fonction en C ou en Java.)

+0

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

Questions connexes