Do czego służy AppDelegate i skąd mam wiedzieć, kiedy go używać?

146

Właśnie zaczynam pracować nad aplikacjami na iPhone'a. Skąd mam wiedzieć, kiedy należy umieszczać rzeczy w AppDelegate, a kiedy w klasie niestandardowej? Czy istnieje reguła lub jakikolwiek rodzaj analogii z innym językiem programowania, takim jak Python lub PHP, który używa wzorca podobnego do AppDelegate?

ponowne zanieczyszczenie
źródło

Odpowiedzi:

255

Zwykle unikam podejścia projektowego sugerowanego przez użycie przez Andrew terminu „serce twojej aplikacji”. Mam na myśli to, że myślę, że należy unikać wrzucania zbyt wielu rzeczy do centralnej lokalizacji - dobry projekt programu zwykle wymaga oddzielenia funkcjonalności według „obszaru zainteresowania”.

Obiekt delegata to obiekt, który jest powiadamiany, gdy obiekt, z którym jest połączony, osiąga określone zdarzenia lub stany. W tym przypadku delegat aplikacji jest obiektem, który otrzymuje powiadomienia, gdy obiekt UIApplication osiągnie określone stany. Pod wieloma względami jest to wyspecjalizowany wzorzec obserwatorów jeden do jednego.

Oznacza to, że „obszarem zainteresowania” dla AppDelegate jest obsługa specjalnych stanów UIApplication. Najważniejsze z nich to:

  • applicationDidFinishLaunching: - dobre do obsługi konfiguracji i konstrukcji podczas uruchamiania
  • applicationWillTerminate: - dobre do czyszczenia pod koniec

Powinieneś unikać umieszczania innych funkcji w AppDelegate, ponieważ tak naprawdę tam nie należą. Takie inne funkcje obejmują:

  • Dane dokumentu - powinieneś mieć singleton menedżera dokumentów (dla aplikacji z wieloma dokumentami) lub pojedynczy dokument (dla aplikacji z jednym dokumentem)
  • Kontrolery przycisków / tabel / widoków, metody delegatów widoku lub inna obsługa widoku (poza budową widoku najwyższego poziomu w applicationDidFinishLaunching :) - ta praca powinna znajdować się w odpowiednich klasach kontrolera widoku.

Wiele osób wrzuca te rzeczy do swojego AppDelegate, ponieważ są leniwi lub myślą, że AppDelegate kontroluje cały program. Powinieneś unikać centralizacji w AppDelegate, ponieważ zakłóca to obszary w aplikacji i nie jest skalowane.

Matt Gallagher
źródło
8
+1 To doskonała odpowiedź. Patrzyłem na przykładowy kod, w którym podwidoki wywołują appDelegate, aby poinstruować kontroler widoku, aby przełączył się na inny widok podrzędny, i to było jak zapach kodu. Dobrze wiedzieć, że mój nos nadal działa.
Alan
2
czasami widzimy coś takiego w samouczkach online: AppDelegate * del = [AppDelegate sharedAppDelegate]; (patrz developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/… ) co to oznacza? widzę przykłady jego użycia, ale tak naprawdę nie rozumiem
stojącej
27

Twój delegat aplikacji jest sercem Twojej aplikacji. W rzeczywistości jest to Twój „Kontroler programu”.

Delegat aplikacji to klasa odbierająca komunikaty na poziomie aplikacji, w tym komunikat applicationDidFinishLaunching, który jest najczęściej używany do inicjowania tworzenia innych widoków.

Chociaż nie jest to dokładnie podobne, możesz o tym myśleć jako o programie „main ()” w programie Cocoa.

Andrew Grant
źródło
Daję ci +1, ponieważ posiadanie wszystkich kontrolerów interfejsu użytkownika w AppDelegate jest mniej kłopotliwe niż tworzenie tych wszystkich niestandardowych klas.
rwols
3
@rwols bądź ostrożny, oddzielenie twoich obaw pomaga w uzyskaniu czystszego kodu, a debugowanie jest mniej kłopotliwe, powinieneś poświęcić trochę czasu na utworzenie tych niestandardowych klas i nie umieszczać wszystkich obserwatorów w jednym pliku.
wheeliez
2

@Shivam, dzięki.

Z tego, co rozumiem appDelegate, jest zbliżony do tego, co Applicationjest w Androidzie. viewDidLoad, viewDidDisappearJest porównywalny do tego, co Lifecycle Android. Każda aplikacja ma cykl życia, od uruchomienia, przez przerwy od przychodzących połączeń, aż po pojawianie się powiadomień. Jeśli chcesz, aby Twój kod zrobił coś specjalnego, gdy systemwystąpią te zdarzenia, musisz napisać kod metod.

W Androidzie używamy onPause, onDestroy, onCreatetrochę callback metody do obsługi takich zdarzeń systemowych.

Siddharth
źródło
Te onPause, onCreateoraz onDestroymetody Androida są bardziej podobny do viewDidDisappear, viewDidLoadmetody cyklu IOS Zobacz sterownika. Jeśli musisz porównać, powiedziałbym, żeApplication klasa Androida byłaby bliższa klasie AppDelegateiOS.
Shivam Bhalla
Dzięki, jeśli możesz lepiej moją odpowiedź, zrób to. Skasuję swoją odpowiedź po przeczytaniu twojej.
Siddharth
1

Mam nadzieję, że to pomoże trochę bardziej ...

Programiści nowi w tym języku zawsze mają to samo pytanie - czy program zaczyna się od metody głównej? Tak, masz rację w tym przypadku; Aplikacje na iOS również zaczynają się od głównej metody.
Twoja główna klasa wywołuje poniższą funkcję:

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

UIApplicationMain uruchamia pętlę uruchamiania Cocoa Touch i infrastrukturę aplikacji, która tworzy UIApplicationobiekt. Nasza aplikacja potrzebuje treści, więc Objective-c używa delegata do obsługi tego. Dlatego nazywamy to AppDelegate (działaj jako delegat UIApplication). Implementujemy niektóre z opcjonalnych metod tego delegata i odpowiednio się zachowuje.

Anurag Bhakuni
źródło
Czy ktoś może mi pomóc zrozumieć, co jest nie tak w powyższej odpowiedzi
Anurag Bhakuni
2
Wydaje się zdezorientowany, ponieważ a) nie używasz właściwej interpunkcji / ortografii / gramatyki, b) jest nie na temat, ponieważ tak naprawdę nie odpowiada na pytanie zadane przez oryginalny plakat.
Kay,