Для чого призначений AppDelegate і як я можу знати, коли ним користуватися?


146

Я тільки починаю працювати над додатками для iPhone. Як я можу дізнатися, коли я повинен розміщувати речі в AppDelegate порівняно зі спеціальним класом? Чи є якесь правило або аналогія з іншою мовою програмування, як Python або PHP, яка використовує зразок AppDelegate?

Відповіді:


255

Я зазвичай уникаю дизайнерського підходу, який передбачає використання Андрієм терміна "серце вашої заявки". Я маю на увазі під цим те, що я думаю, що вам слід уникати забивання занадто багато речей у центральному місці - хороший дизайн програми зазвичай передбачає розділення функціональності на "область, що викликає занепокоєння".

Об'єкт-делегат - це об'єкт, який отримує сповіщення, коли об’єкт, до якого він підключений, досягає певних подій або станів. У цьому випадку Делегат додатків - це об'єкт, який отримує сповіщення, коли об’єкт UIApplication досягає певних станів. Багато в чому це спеціалізований зразок спостереження один на один.

Це означає, що "область, яка хвилює" для AppDelegate, обробляє спеціальні стани застосунку UIA. Найважливіші з них:

  • applicationDidFinishLaunching - добре підходить для налаштування та побудови при запуску
  • застосуванняWillTerminate: - добре для очищення в кінці

Вам слід уникати розміщення інших функцій в AppDelegate, оскільки вони насправді там не належать. Такий інший функціонал включає:

  • Дані про документ - у вас повинен бути менеджер документів одиночний (для декількох додатків документів) або документ одиночний (для одиночних програмних документів)
  • Кнопки / таблиці / контролери перегляду, переглядати способи делегування або інші види обробки (за винятком побудови подання верхнього рівня в applicationDidFinishLaunching :) - ця робота повинна бути у відповідних класах контролерів перегляду.

Багато людей збивають ці речі у своєму AppDelegate, тому що вони ліниві або вважають, що AppDelegate контролює всю програму. Вам слід уникати централізації у вашому AppDelegate, оскільки це замулює сфери, які викликають занепокоєння у додатку, і не масштабується.


8
+1 Це відмінна відповідь. Я дивився на деякий зразок коду, у якого були підрозділи виклику appDelegate do, щоб доручити контролеру перегляду перейти на інший підпогляд, і це відчувало як запах коду. Добре знати, що мій ніс все ще працює.
Алан

2
іноді щось подібне ми бачимо в підручниках в Інтернеті: AppDelegate * del = [AppDelegate sharedAppDelegate]; (див. developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/… ) що це означає? я можу побачити приклади його використання, але я не дуже розумію теорію, що стоїть за ним (див. приклад: developer.apple.com/library/ios/#samplecode/… )
abbood

27

Делегат вашої програми - це серце вашої заявки. Це ефективно ваш "програмний контролер".

Делегат додатків - це клас, який приймає повідомлення на рівні програми, включаючи повідомлення applicationDidFinishLaunching, яке найчастіше використовується для ініціювання створення інших представлень.

Хоча це не зовсім подібне, ви можете вважати це як "основний ()" режим вашої програми з какао.


Я даю +1 вам, тому що мати всі ваші контролери користувальницького інтерфейсу в AppDelegate - це менше клопоту, ніж створювати для цього всі власні класи.
rwols

3
@rwols будьте обережні, розділення ваших проблем допомагає більш чистим кодом, і це менше клопоту налагоджувати, вам потрібно витратити час на створення цих спеціальних класів і не помістити всіх своїх спостерігачів в один файл.
wheeliez

2

@Shivam, спасибі

З того, що я розумію appDelegate, близький до того, що Applicationє в Android. viewDidLoad, viewDidDisappearПорівняно з яким життєвим циклом Android. Кожна програма має життєвий цикл - від запуску до перерв у дзвінках, що надходять, до появи сповіщень. Якщо вам потрібен ваш код, щоб зробити щось особливе, коли ці systemподії відбуваються, тоді вам потрібно написати код методами.

В Android ми використовуємо onPause, onDestroy, onCreateсвого роду методи зворотного виклику для обробки таких системних подій.


В onPause, onCreateі onDestroyметоди Android більше схожі на viewDidDisappear, viewDidLoadметоди життєвого циклу ИОСА Подивитися контролер. Якщо вам доведеться порівнювати, я б сказав, що Applicationклас Android буде ближче до AppDelegateiOS.
Shivam Bhalla

Дякую, якщо ти можеш краще відповісти, будь ласка. Я видалю свою відповідь, прочитавши вашу.
Сіддхарт

1

Сподіваюсь, це допоможе трохи більше ...

Програмісти, новички цієї мови, завжди мають одне і те ж питання - чи програма починається з основного методу? Так, ви маєте рацію в цьому випадку; Програми IOS також починаються з основного методу.
Ваш основний клас викликає наступну функцію:

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

UIApplicationMain запускає цикл запуску Cocoa Touch та інфраструктуру додатків, яка створює UIApplicationоб'єкт. Нашій програмі потрібен вміст, тому Objective-c використовує делегата для вирішення цього питання. Ось чому ми називаємо це AppDelegate (виконує функції делегата UIApplication). Ми реалізуємо деякі необов'язкові методи цього делегата, і він поводиться відповідно.


будь ласка, хтось може змусити мене зрозуміти, що не так у цій відповіді
Анураг Бхакуні

2
Це здається заплутаним, оскільки: а) ви не використовуєте належних розділових знаків / орфографії / граматики;
Кей
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.