A cosa serve l'AppDelegate e come faccio a sapere quando usarlo?


146

Sto appena iniziando a lavorare su app per iPhone. Come faccio a sapere quando dovrei inserire elementi in AppDelegate rispetto a una classe personalizzata? Esiste una regola o qualche tipo di analogia con un altro linguaggio di programmazione come Python o PHP che utilizza un modello AppDelegate come?

Risposte:


255

Di solito evito l'approccio progettuale implicito nell'uso da parte di Andrew del termine "cuore della tua applicazione". Ciò che intendo con questo è che penso che dovresti evitare di ingombrare troppe cose in una posizione centrale: una buona progettazione del programma implica normalmente la separazione delle funzionalità per "area di interesse".

Un oggetto delegato è un oggetto che viene avvisato quando l'oggetto a cui è collegato raggiunge determinati eventi o stati. In questo caso, il delegato dell'applicazione è un oggetto che riceve notifiche quando l'oggetto UIApplication raggiunge determinati stati. Per molti aspetti, è un modello osservatore one-to-one specializzato.

Ciò significa che l '"area di interesse" per il delegato dell'App sta gestendo stati di applicazione UIA speciali. I più importanti di questi sono:

  • applicationDidFinishLaunching: - buono per gestire la configurazione e la costruzione all'avvio
  • applicationWillTerminate: - buono per la pulizia alla fine

Dovresti evitare di inserire altre funzionalità in AppDelegate poiché non appartengono davvero a questo. Tale altra funzionalità include:

  • Dati del documento: è necessario disporre di un singleton del gestore documenti (per più applicazioni di documento) o di un singleton del documento (per applicazioni di singolo documento)
  • Controller pulsante / tabella / vista, metodi del delegato vista o altra gestione della vista (tranne per la costruzione della vista di livello superiore in applicationDidFinishLaunching :) - questo lavoro dovrebbe essere nelle rispettive classi di controller di vista.

Molte persone inseriscono queste cose nel loro AppDelegate perché sono pigre o pensano che l'AppDelegate controlli l'intero programma. Dovresti evitare la centralizzazione nel delegato dell'app perché confonde le aree problematiche nell'app e non si ridimensiona.


8
+1 Questa è una risposta eccellente. Stavo guardando un codice di esempio che aveva viste secondarie che chiamano l'appDelegate per istruire un controller di visualizzazione a passare a una vista secondaria diversa e che sembrava un odore di codice. Buono a sapersi che il mio naso funziona ancora.
Alan,

2
a volte vediamo qualcosa di simile nei tutorial online: AppDelegate * del = [AppDelegate sharedAppDelegate]; (vedi developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/… ) cosa significa? posso vedere degli esempi su come usarlo ma non capisco davvero la teoria alla base (vedi questo esempio: developer.apple.com/library/ios/#samplecode/… )
abbood

27

Il delegato dell'applicazione è il cuore dell'applicazione. È effettivamente il tuo "programmatore".

Il delegato dell'applicazione è la classe che riceve i messaggi a livello di applicazione, incluso il messaggio applicationDidFinishLaunching più comunemente usato per avviare la creazione di altre viste.

Sebbene non sia esattamente simile, potresti considerarlo la routine "main ()" del tuo programma Cocoa.


Ti do +1 perché avere tutti i tuoi controller UI in AppDelegate è meno complicato della creazione di tutte quelle classi personalizzate per esso.
rwols il

3
@rwols stai attento, separare le tue preoccupazioni aiuta a rendere più pulito il codice ed è meno complicato eseguire il debug, dovresti prenderti il ​​tempo di creare quella classe personalizzata e non mettere tutti i tuoi osservatori in un singolo file.
Wheeliez,

2

@Shivam, grazie.

Da quello che ho capito appDelegate, è vicino a ciò che Applicationè in Android. Il viewDidLoad, viewDidDisappearè paragonabile a quello del ciclo di vita di Android. Ogni applicazione ha un ciclo di vita, dal lancio alle interruzioni dalle chiamate in arrivo, alle notifiche visualizzate. Se hai bisogno del tuo codice per fare qualcosa di speciale quando si systemverificano questi eventi, devi scrivere il codice sui metodi.

In Android utilizziamo onPause, in qualche modo onDestroy, onCreatemetodi di callback per gestire tali eventi di sistema.


I onPause, onCreatee le onDestroymodalità di Android sono più simili al viewDidDisappear, viewDidLoadi metodi del ciclo di vita di un View Controller di iOS. Se devi confrontare, direi che la Applicationclasse di Android sarebbe più vicina a quella AppDelegatedi iOS.
Shivam Bhalla,

Grazie, se puoi migliorare la mia risposta, per favore, fallo. Eliminerò la mia risposta dopo aver letto la tua.
Siddharth,

1

Spero che questo possa aiutare un po 'di più ...

I programmatori che non conoscono questa lingua hanno sempre la stessa domanda: il programma parte da un metodo principale? Sì, hai ragione in questo caso; Anche le app IOS partono da un metodo principale.
La tua classe principale chiama la seguente funzione:

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

UIApplicationMain dà il via al ciclo di esecuzione di Cocoa Touch e all'infrastruttura dell'app che crea un UIApplicationoggetto. La nostra applicazione ha bisogno di contenuti, quindi goal-c usa un delegato per gestirlo. Ecco perché lo chiamiamo AppDelegate (fungere da delegato di UIApplication). Implementiamo alcuni dei metodi opzionali di quel delegato e si comporta di conseguenza.


per favore qualcuno può farmi capire cosa c'è che non va nella risposta sopra
Anurag Bhakuni

2
Sembra confuso perché a) non usi la punteggiatura / l'ortografia / la grammatica appropriate, b) è off-topic in quanto non risponde realmente alla domanda posta dal poster originale.
Kay,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.