Quelle est la différence entre les données source et de déléguer?
J'ai une question fondamentale liée à de Cacao cadres de modèles de conception.
Quelle est la différence entre le délégué et la source de données?
Deux d'entre eux pourraient utiliser @protocols
déclaration, mais certaines classes ou des cadres utilisation de delegate
, et quelques autres sont à l'aide de datasource
.
Tout ce que je peux comprendre de UI/NSTableView
est le delegate
répondre liées à l'INTERFACE utilisateur des événements, alors que la datasource
est purement liées aux données. Mais, je ne sais pas de toute source de données implémentations à l'extérieur de l'classes de l'INTERFACE utilisateur de Cacao.
Remarque:
- Le délégué je l'ai mentionné dans cette question n'est pas toujours liée à des événements de l'UI.
- La source de données la question a été répondue.
Vous devez vous connecter pour publier un commentaire.
Le délégué et source de données les modèles sont largement indépendantes, et orthogonale:
Le délégué motif est très courant dans le Cacao et permet à un délégué (toute instance de mise en œuvre de l'informel délégué protocole préalable à OS X 10.6, ou par la forme de délégué
@protocol
en 10.6 et versions ultérieures) pour modifier le comportement d'une instance d'objet. Ce modèle est souvent utilisé à la place de sous-classement: au lieu de sous-classement d'une classe à modifier son comportement, vous offre un délégué qui répond à des méthodes appropriées. Les Classes qui utilisent les délégués envoyer des messages à leurs délégué à contracté des événements. L'API entre la classe et le délégué est définie par la classe et est différente pour chaque classe qui utilise le motif, mais l'API se compose généralement de messages demandant le délégué de comment gérer un événement particulier. Un avantage de la délégué schéma de sous-classement est qu'une classe peut implémenter plusieurs délégué protocoles, permettant ainsi à ses instances pour agir en tant que délégué pour plusieurs classes. De même, une instance de l'objet peut être le délégué pour de multiples autres objets (donc les plus délégué Api de passer de l'objet en tant que premier argument de chaque message dans l'API). Le modèle de délégué n'est pas aussi commun dans d'autres cadres de l'INTERFACE utilisateur (bien que Qt utilise le modèle de délégué dans son Modèle/Vue), et est pas le même que .Net/CLR délégués qui sont essentiellement des tapé des pointeurs de fonction.Le modèle de source de données est souvent utilisé par les
NSView
sous-classes dans le Cacao qui ont le complexe de l'état des données telles que NSBrowser, NSTableView, NSOutlineView, etc. La source de données de protocole définit une API que les instances de ces classes peuvent utiliser pour obtenir les données à afficher dans la vue. Bien que laNSController
et le Cacao Liaisons architectures ont remplacé les nombreuses utilisations du modèle de source de données, il est encore fréquent et très puissant. Comme le délégué modèle décrit ci-dessus, une partie de sa puissance provient d'un objet d'être en mesure d'agir en tant que source de données de multiples sources de données-à l'aide des instances (et peut-être même des instances de plusieurs classes différentes de la source de données, les protocoles). Le modèle de source de données est utilisé couramment dans d'autres cadres de l'INTERFACE utilisateur, tels que Qt (dans le Modèle/Vue où le modèle est analogue à la source de données) et WPF/Silverlight (où la source de données peut être plus étroitement analogue à la vue modèle).NSEvent
transmis à l'application via l'exécution de la boucle). Un objet peut demander à un délégué de la façon de réagir à un événement (unNSEvent
type d'événement ou tout autre message à partir d'un autre objet). Sources de données ne sont pas utilisés à l'extérieur des classes de l'INTERFACE utilisateur, car ils ne sont pas nécessaires; le modèle MVC est sa propre source de données.La source de données fournit les données, le délégué de fournitures le comportement.
Dans MVC, de la source de données est dans la couche du modèle et le délégué est dans la couche de contrôle.
En fait, à la réflexion, la source de données est généralement contrôleur qui est plus bas, plus près du modèle. Je ne pense pas que je ai jamais utilisé un modèle de l'objet comme ma source de données.
Avant de répondre à la question, vous devez mieux comprendre la délégation modèle de conception:
Permettez-moi de commencer par une question:
Par défaut une TableView est comme ceci:
Comment un UITableView savoir combien de cellules à présent? quoi présents dans chaque cellule?
Maintenant que vous savez ce que Délégation, pour répondre à la question de l'OP:
C'est surtout une ÉNORME question des différences sémantiques.
Si vous êtes seul à utiliser ( ne pas créer votre propre protocole) de la fondation délégués et les sources de données, alors il n'a vraiment pas d'importance pour vous. Toutefois, si vous avez l'intention d'écrire des protocoles personnalisés, puis les comprendre serait de vous aider à écrire ( et avec une plus grande importance de lecture, lunette) code mieux.
À partir d'un point de vue du développeur, Ils ont tous deux traitent de l'interaction entre les delegat-ing de classe et de délégué de classe.
Source De Données
En d'autres termes:
Source de données traite principalement avec ce et n'a généralement c'est des trucs lors de l'initialisation.
Délégué traite principalement avec comment et flux vous certains paramètres pour donner un certain comportement c'est à dire si l'utilisateur a cliqué sur ce... que doit-il arriver? si ils glissée...ce qui doit arriver?
Comme un exemple pour tableView:
Source de données
De quoi a-t-elle à l'intérieur? Quel type de cellule suis-je présenter?
cellForRowAtIndexPath
.Quel est le titre de l'Article?
titleForHeaderInSection
Combien de cellules sont-ils?
numberOfRowsInSection
Et, par conséquent, vous avez généralement retour valeurs. Pour les délégués, il est plus courant d'être de type
void
.Source de données méthodes
Délégué Méthodes
j'ai bien évidemment choisi de manière sélective certains de source de données, les méthodes de non retour, et certains délégué méthode de retour
Délégué
Que dois-je faire/ce que "forme de comportement" devrais-je utiliser après la fin de l'affichage du pied de page, voulez-vous me pop une alerte?
didEndDisplayingFooterView
Vais-je avoir accessoryType qui donne à la cellule de quelques fonctionnalités supplémentaires?
accessoryTypeForRowWithIndexPath
De mon point de vue, un
DataSource
est un objet qui ne sait pas où sont les données, et donc vous devez les fournir. Comme dire à un objet combien d'éléments dans une colonne.Un
Delegate
, qui est une partie de l'objet montre pour vous, doit être mis en œuvre par votre classe, parce que l'objet ne sait où sont les données, mais il ne sait pas comment l'utiliser correctement.Pour faire court:
Délégué se rapporte à l'INTERFACE utilisateur et les actions de l'Utilisateur contre les cellules de la table.
méthodes communes: willSelectRow, didSelectRow, willDisplay, heightForRow, willBeginEditingAt
Source de données traite de l'édition, de la population et l'affichage des données sur
la tableview.
méthodes communes canEditRowAt, de valider, de titleForHeaderInSection, cellForRowAt, numberOfSections, sectionIndexTitles
Les deux sont Protocole, aujourd'hui, la principale intension de Protocole est de garder un codage universel de la pratique, ou même pratique de codage pour tous(à ma connaissance). Supposons que je suis entrain de créer un tableView sans UITableViewDataSource & UITableViewDelegate, je voudrais créer la tableView telle façon que vous ne pouvez pas. C'est là que les Protocole vient, apple a créé un ensemble de règle ou protocole et tout le monde ont à le suivre. Maintenant source de données & Délégué sont évidemment Protocole, en voyant le nom, vous pourriez le comprendre source de données traite avec quelque chose comme numberOfRowsInSection, cellForRowAtIndexPath, numberOfSections de tableView où une certaine forme de données est en train d'être prises/traité, et Délégués sont didSelectRow, willSelectRow, heightForRow etc de tableView où son lien avec certains type de l'INTERFACE utilisateur modifier/action. Alors c'est juste de la convention de nommage de rien hypothétique pour garder la tâche distincte. Comme @kubi dit plus tôt: La source de données fournit les données, le délégué de fournitures le comportement.