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.
11
Antworten:
Um zu verstehen
delegates
, muss man verstehenprotocols
.A
protocol
ist wie ein Servicevertrag. Wenn ein Objekt (meistens eineUIViewController
Unterklasse, 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 derNSNotificationCenter
Anmeldung für eine bestimmte Interessenstufe. Der Unterschied besteht darin, dass ein Objekt, das eine Delegierung verwendet, jeweils nur eines haben kanndelegate
, wobei sich mehrere Objekte für dasselbe anmelden könnenNSNotification
.Apple verwendet die Delegierung allgegenwärtig. Immer mehr, aber sind Sie sehen Apple eine Menge ihrer API über bewegen
blocks
, die ähnlich sind ,callbacks
in 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
UITableView
weiß a, wie Zeilen und Abschnitte angezeigt werden. Es kannUITableViewCells
aus Leistungsgründen wiederverwendet werden. Es kennt alle anderen Dinge, die manUIScrollView
kennt. 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 sollenNSIndexPath
. 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
UITableView
und 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
,UICollectionView
etc.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
@required
standardmäß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 ControllerWenn 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
@optional
bei Bedarf erstellen) und senden es:Setzen Sie dann den Delegaten Ihres MyChildViewControllers auf
self
und implementieren Sie ihn- (void)buttonWasTappedInChild:(MyChildViewController *)childViewController
in 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!
quelle
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.quelle