Was ist Delegation und warum ist sie bei der iOS-Programmierung wichtig?


11

Im Moment unterrichte ich mich selbst in iOS-Programmierung, und ein Konzept, mit dem ich mich nur schwer auseinandersetzen kann, ist die Delegation. Was ist es? Warum und wie wird es verwendet? Was ist der Vorteil? Das technische Schreiben aus dem Buch, das ich lese, macht es schwer zu verstehen.


4
Möglicherweise ist die Ziel- Schnittmenge von c + -Delegierten- Tags beim Stapelüberlauf hilfreich.

Antworten:


16

Um zu verstehen delegates, muss man verstehen protocols.

A protocolist wie ein Servicevertrag. Wenn ein Objekt (meistens eine UIViewControllerUnterklasse, aber nicht immer) diesen Vertrag unterschreibt, heißt es "Ich bin daran interessiert, Logik zur Unterstützung der Nachricht bereitzustellen, die Sie mir senden". Dies ähnelt der NSNotificationCenterAnmeldung für eine bestimmte Interessenstufe. Der Unterschied besteht darin, dass ein Objekt, das eine Delegierung verwendet, jeweils nur eines haben kann delegate, wobei sich mehrere Objekte für dasselbe anmelden können NSNotification.

Apple verwendet die Delegierung allgegenwärtig. Immer mehr, aber sind Sie sehen Apple eine Menge ihrer API über bewegen blocks, die ähnlich sind , callbacksin anderen Sprachen.

Abgesehen davon hilft die Delegierung bei der Aufrechterhaltung der MVC, obwohl ich behaupten würde, dass die Delegierung ein Entwurfsmuster für sich ist. Es hilft, Modelle von Controllern zu trennen. Wie in John Cartwrights Beispiel UITableViewweiß a, wie Zeilen und Abschnitte angezeigt werden. Es kann UITableViewCellsaus Leistungsgründen wiederverwendet werden. Es kennt alle anderen Dinge, die man UIScrollViewkennt. Es weiß jedoch nicht, welche Zellen angezeigt werden sollen. Er weiß nicht , was diese Zellen besiedeln mit. Es weiß nicht, welche Zellen für eine bestimmte wiederverwendet werden sollen NSIndexPath. Dies sollte sowieso wirklich die Aufgabe des Controllers sein. Durch die Delegierung kann die Tabellenansicht diese Nichtansichtslogik auf ein Objekt auslagern, das diese Verantwortung sowieso haben sollte.

Darüber hinaus sind Sie während der gesamten Lebensdauer eines Objekts nicht an einen Delegaten gebunden. Sie können sehr leicht mehrere Datenquellen für eine bestimmte haben UITableViewund diese zur Laufzeit nach Bedarf umschalten.

Einerseits eignet sich die Delegierung hervorragend, um Daten von einem Objekt bereitzustellen und auf Interaktionen zu reagieren. Sie werden es in vielen UIKit Klassen sehen, wie ein UITableView, UIPickerView, UICollectionViewetc.

Die Delegierung ist jedoch auch sehr nützlich, wenn Sie Informationen zwischen Objekten übertragen möchten. Sie können ganz einfach Ihre eigenen Protokolle erstellen und Ihre eigenen Objekte registrieren, um ihnen zu folgen. Darüber hinaus sind Protokollmethoden @requiredstandardmäßig verfügbar, Sie können jedoch einige Methoden angeben@optional. Dies kann Ihnen eine schöne Flexibilität geben, wenn Sie es brauchen. Angenommen, Sie haben einen übergeordneten Ansichtscontroller und einen untergeordneten Ansichtscontroller. Möglicherweise verwenden Sie dazu die neue Containment-API. Wenn Sie Informationen vom Elternteil an das Kind übergeben müssen, tun Sie dies normalerweise mit einer Eigenschaft. Erledigt. Was aber, wenn Sie Informationen vom Kind an die Eltern zurückgeben müssen? Möglicherweise ändert sich etwas am Kind und Sie müssen das Elternteil benachrichtigen. Sicher, Sie könnten KVO für bestimmte Werte durchführen. Aber vielleicht möchten Sie wissen, wann eine Taste gedrückt wird. Erstellen Sie einfach ein neues Protokoll im Child View Controller

@protocol MyChildDelegate
- (void)buttonWasTappedInChild:(MyChildViewController *)childViewController;
@end

@interface MyChildViewController : UIViewController

@property (weak, nonatomic) id <MyChildDelegate> delegate;

@end

Wenn Sie in MyChildViewController auf Ihre Schaltfläche tippen, überprüfen Sie einfach, ob Ihr Delegat auf die Delegatennachricht reagiert (wenn dies erforderlich ist und Ihr Delegat die Methode nicht implementiert, stürzen Sie ab. Sie können die Methode @optionalbei Bedarf erstellen) und senden es:

- (IBAction)someButtonTapped:(id)sender {
    if ([self.delegate respondsToSelector:@selector(buttonWasTappedInChild:)]) {
        [self.delegate buttonWasTappedInChild:self];
    }
}

Setzen Sie dann den Delegaten Ihres MyChildViewControllers auf selfund implementieren Sie ihn - (void)buttonWasTappedInChild:(MyChildViewController *)childViewControllerin Ihrem übergeordneten View Controller. BOOM! Sie haben Informationen, die von einem Kind an das Elternteil weitergegeben wurden. Die Beziehung zwischen den beiden Objekten muss nicht einmal so eng sein wie die von Eltern / Kind. Es handelt sich um einen Servicevertrag. Solange das Objekt, das sich anmeldet, durch die Implementierung der erforderlichen Methoden das Ende des Geschäftes erreicht, sind Sie goldrichtig!

HINWEIS: Delegaten sollten schwach sein / Eigenschaften zuweisen, andernfalls treten Sie in einen Aufbewahrungszyklus ein, in dem kein Objekt freigegeben werden kann.

Hoffe das hilft!


2

Delegaten sind Objekte, die bestimmte Funktionen implementieren, wenn es nicht sinnvoll ist, diese Funktionen auf dem normalen Objekt zu implementieren. Es ist eine Form der Abhängigkeitsinjektion.

Ein konkretes Beispiel finden Sie im UITableViewDelegate-Protokoll. Diese Methoden sind für die direkte Implementierung einer Tabellenansicht nicht sinnvoll, da die Aktionen zum Auswählen einer Tabellenansichtszeile in jeder App und möglicherweise in jeder Tabellenansicht unterschiedlich sind. Der Delegat verfügt über eine Methode -tableView:didSelectRowAtIndexPath:, mit der Sie ein Objekt erstellen können, das die Zeilenauswahl übernimmt, ohne die Tabellenansicht für jede einzelne Aktion, die Sie implementieren möchten, zu unterklassifizieren.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.