Для чего нужен AppDelegate и как узнать, когда его использовать?
Я только начинаю работать над приложениями для iPhone. Как узнать, когда я должен помещать материал в AppDelegate по сравнению с пользовательским классом? Существует ли правило или аналогия с другим языком программирования, таким как Python или PHP, который использует шаблон типа AppDelegate?
4 ответа
Я обычно избегаю подхода к дизайну, который подразумевает использование Эндрю термина "сердце вашего приложения". Под этим я подразумеваю то, что я думаю, что вам следует избегать слишком большого количества вещей в одном месте - хороший дизайн программы обычно предполагает разделение функциональности на "проблемную область".
Объект делегата - это объект, который получает уведомление, когда объект, к которому он подключен, достигает определенных событий или состояний. В этом случае делегат приложения - это объект, который получает уведомления, когда объект UIApplication достигает определенных состояний. Во многих отношениях это специализированный паттерн "Наблюдатель один на один".
Это означает, что "проблемная область" для AppDelegate обрабатывает специальные состояния UIApplication. Наиболее важными из них являются:
- applicationDidFinishLaunching: - хорошо для обработки конфигурации и построения при запуске
- applicationWillTerminate: - хорошо для очистки в конце
Вы должны избегать добавления других функций в AppDelegate, так как они там на самом деле не принадлежат. Такая другая функциональность включает в себя:
- Данные документа - у вас должен быть одноэлементный менеджер документов (для приложений с несколькими документами) или одноэлементный документ (для приложений с одним документом)
- Контроллеры кнопок / таблиц / представлений, методы делегатов представлений или другая обработка представлений (за исключением построения представления верхнего уровня в applicationDidFinishLaunching:) - эта работа должна выполняться в соответствующих классах контроллеров представлений.
Многие люди помещают эти вещи в свой AppDelegate, потому что они ленивы или думают, что AppDelegate контролирует всю программу. Вы должны избегать централизации в вашем AppDelegate, так как он запутывает проблемные области в приложении и не масштабируется.
Ваш делегат приложения является сердцем вашей заявки. Это по сути ваш "программный контроллер".
Делегат приложения - это класс, который получает сообщения уровня приложения, включая сообщение applicationDidFinishLaunching, наиболее часто используемое для инициирования создания других представлений.
Хотя это не совсем похоже, вы можете думать об этом как о "main()" вашей программы Cocoa.
@Shivam, спасибо.
Из того, что я понимаю appDelegate
, близко к тому, что Application
находится в Android. viewDidLoad
, viewDidDisappear
сравнимо с тем, что жизненный цикл Android. Каждое приложение имеет жизненный цикл, от запуска до прерывания от входящих вызовов до появления уведомлений. Если вам нужен ваш код, чтобы сделать что-то особенное, когда эти system
события происходят, тогда вам нужно написать код методы.
В Android мы используем onPause
, onDestroy
, onCreate
своего рода методы обратного вызова для обработки таких системных событий.
Надеюсь, это поможет немного больше...
У программистов, плохо знакомых с этим языком, всегда один и тот же вопрос - начинается ли программа с основного метода? Да, вы правы в этом случае; Приложения IOS также начинаются с основного метода.
Ваш основной класс вызывает следующую функцию:
UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
UIApplicationMain запускает цикл запуска Cocoa Touch и инфраструктуру приложений, которая создает UIApplication
объект. Наше приложение нуждается в контенте, поэтому для выполнения этой задачи target-c использует делегат. Вот почему мы называем это AppDelegate (выступать в качестве делегата UIApplication
). Мы реализуем некоторые из дополнительных методов этого делегата, и он ведет себя соответственно.