Wofür ist das AppDelegate und woher weiß ich, wann ich es verwenden soll?

146

Ich fange gerade an, an iPhone-Apps zu arbeiten. Woher weiß ich, wann ich Inhalte in AppDelegate im Vergleich zu einer benutzerdefinierten Klasse einfügen sollte? Gibt es eine Regel oder eine Analogie zu einer anderen Programmiersprache wie Python oder PHP, die ein AppDelegate-ähnliches Muster verwendet?

resopollution
quelle

Antworten:

255

Normalerweise vermeide ich den Designansatz, den Andrews Verwendung des Begriffs "Herzstück Ihrer Anwendung" impliziert. Damit meine ich, dass Sie meiner Meinung nach vermeiden sollten, zu viele Dinge an einem zentralen Ort zusammenzufassen - ein gutes Programmdesign beinhaltet normalerweise die Trennung der Funktionalität nach "Problembereich".

Ein Delegatenobjekt ist ein Objekt, das benachrichtigt wird, wenn das Objekt, mit dem es verbunden ist, bestimmte Ereignisse oder Zustände erreicht. In diesem Fall ist der Anwendungsdelegierte ein Objekt, das Benachrichtigungen erhält, wenn das UIApplication-Objekt bestimmte Zustände erreicht. In vielerlei Hinsicht handelt es sich um ein spezielles Eins-zu-Eins-Beobachtermuster.

Dies bedeutet, dass der "Problembereich" für das AppDelegate spezielle UIApplication-Zustände behandelt. Die wichtigsten davon sind:

  • applicationDidFinishLaunching: - Gut für die Konfiguration und Erstellung beim Start
  • applicationWillTerminate: - Gut zum Aufräumen am Ende

Sie sollten vermeiden, andere Funktionen in das AppDelegate aufzunehmen, da diese nicht wirklich dazu gehören. Zu diesen anderen Funktionen gehören:

  • Dokumentdaten - Sie sollten einen Dokumentmanager-Singleton (für mehrere Dokumentanwendungen) oder einen Dokument-Singleton (für einzelne Dokumentanwendungen) haben.
  • Schaltflächen- / Tabellen- / Ansichts-Controller, Ansichtsdelegatenmethoden oder andere Ansichtsbehandlungen (mit Ausnahme der Erstellung der Ansicht der obersten Ebene in applicationDidFinishLaunching :) - Diese Arbeit sollte in den jeweiligen Ansichtssteuerungsklassen erfolgen.

Viele Leute werfen diese Dinge in ihr AppDelegate, weil sie faul sind oder denken, dass das AppDelegate das gesamte Programm steuert. Sie sollten eine Zentralisierung in Ihrem AppDelegate vermeiden, da dies die Problembereiche in der App trübt und nicht skaliert.

Matt Gallagher
quelle
8
+1 Dies ist eine hervorragende Antwort. Ich habe mir einen Beispielcode angesehen, bei dem Unteransichten das appDelegate do aufrufen, um einen Ansichts-Controller anzuweisen, zu einer anderen Unteransicht zu wechseln, und der sich wie ein Codegeruch anfühlte. Gut zu wissen, dass meine Nase immer noch funktioniert.
Alan
2
Manchmal sehen wir so etwas in Online-Tutorials: AppDelegate * del = [AppDelegate sharedAppDelegate]; (siehe developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/… ) Was bedeutet das? Ich kann Beispiele für die Verwendung sehen, aber ich verstehe die Theorie dahinter nicht wirklich (siehe dieses Beispiel: developer.apple.com/library/ios/#samplecode/… )
Abbood
27

Ihr Bewerbungsdelegierter ist das Herzstück Ihrer Bewerbung. Es ist effektiv Ihr "Programm-Controller".

Der Anwendungsdelegierte ist die Klasse, die Nachrichten auf Anwendungsebene empfängt, einschließlich der Nachricht applicationDidFinishLaunching, die am häufigsten zum Initiieren der Erstellung anderer Ansichten verwendet wird.

Obwohl es nicht genau ähnlich ist, können Sie es sich als die "main ()" - Routine Ihres Cocoa-Programms vorstellen.

Andrew Grant
quelle
Ich gebe Ihnen +1, weil es weniger mühsam ist, alle Ihre UI-Controller im AppDelegate zu haben, als all diese benutzerdefinierten Klassen dafür zu erstellen.
rwols
3
@rwols Seien Sie vorsichtig, die Trennung Ihrer Bedenken hilft für saubereren Code und das Debuggen ist weniger mühsam. Sie sollten sich die Zeit nehmen, um diese benutzerdefinierten Klassen zu erstellen, und nicht alle Ihre Beobachter in einer einzigen Datei zusammenfassen.
Wheeliez
2

@ Shivam, danke.

Soweit ich weiß appDelegate, kommt es dem nahe, was Applicationin Android ist. Das viewDidLoad, viewDidDisappearist vergleichbar mit dem , was Android Lifecycle. Jede Anwendung hat einen Lebenszyklus, vom Starten über Unterbrechungen durch eingehende Anrufe bis hin zu angezeigten Benachrichtigungen. Wenn Sie Ihren Code benötigen, um etwas Besonderes zu tun, wenn diese systemEreignisse auftreten, müssen Sie die Methoden codieren.

In Android nutzen wir onPause, onDestroy, onCreateirgendwie Methoden Rückruf solche Systemereignisse zu handhaben .

Siddharth
quelle
Die onPause, onCreateund onDestroyMethoden von Android sind ähnlich wie die viewDidDisappear, viewDidLoadMethoden eines iOS - View - Controller Lebenszyklus. Wenn Sie vergleichen müssen, würde ich sagen, dass die ApplicationKlasse von Android näher an der AppDelegatevon iOS wäre.
Shivam Bhalla
Danke, wenn Sie meine Antwort verbessern können, tun Sie es bitte. Ich werde meine Antwort löschen, nachdem ich Ihre gelesen habe.
Siddharth
1

Hoffe das hilft ein bisschen mehr ...

Programmierer, die neu in dieser Sprache sind, haben immer die gleiche Frage: Startet das Programm von einer Hauptmethode? Ja, Sie haben in diesem Fall Recht. IOS-Apps beginnen ebenfalls mit einer Hauptmethode.
Ihre Hauptklasse ruft die folgende Funktion auf:

 UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 

UIApplicationMain startet die Cocoa Touch-Run-Loop- und App-Infrastruktur, mit der ein UIApplicationObjekt erstellt wird. Unsere Anwendung benötigt Inhalte, daher verwendet Objective-C einen Delegaten, um dies zu handhaben. Deshalb nennen wir es AppDelegate (fungieren als Delegierter von UIApplication). Wir implementieren einige der optionalen Methoden dieses Delegaten und es verhält sich entsprechend.

Anurag Bhakuni
quelle
Bitte kann jemand mich verstehen lassen, was in der obigen Antwort falsch ist
Anurag Bhakuni
2
Es scheint verwirrt zu sein, weil a) Sie keine korrekte Zeichensetzung / Rechtschreibung / Grammatik verwenden, b) es nicht zum Thema gehört, da es die Frage, die das Originalplakat gestellt hat, nicht wirklich beantwortet.
Kay