Для чего нужен AppDelegate и как узнать, когда его использовать? - PullRequest
139 голосов
/ 17 марта 2009

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

Ответы [ 4 ]

237 голосов
/ 17 марта 2009

Я обычно избегаю подхода к дизайну, подразумеваемого тем, что Эндрю использует термин «сердце вашего приложения». Под этим я подразумеваю то, что я думаю, что вам следует избегать слишком большого количества вещей в одном месте - хороший дизайн программы обычно предполагает разделение функциональности на «проблемную область».

Объект делегата - это объект, который получает уведомление, когда объект, к которому он подключен, достигает определенных событий или состояний. В этом случае делегат приложения - это объект, который получает уведомления, когда объект UIApplication достигает определенных состояний. Во многих отношениях это специализированный паттерн Observer один на один.

Это означает, что «проблемная область» для AppDelegate обрабатывает специальные состояния UIApplication. Наиболее важными из них являются:

  • applicationDidFinishLaunching: - хорошо для обработки конфигурации и построения при запуске
  • applicationWillTerminate: - хорошо для очистки в конце

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

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

Многие люди помещают эти вещи в свой AppDelegate, потому что они ленивы или думают, что AppDelegate контролирует всю программу. Вы должны избегать централизации в вашем AppDelegate, так как он запутывает проблемные области в приложении и не масштабируется.

24 голосов
/ 17 марта 2009

Ваш представитель приложения является сердцем вашего приложения. Это фактически ваш «программный контроллер».

Делегат приложения - это класс, который получает сообщения уровня приложения, включая сообщение applicationDidFinishLaunching, наиболее часто используемое для инициирования создания других представлений.

Хотя это не совсем похоже, вы можете думать об этом как о "main ()" вашей программы Cocoa.

2 голосов
/ 27 января 2017

@ Шивам, спасибо.

Из того, что я понимаю, appDelegate близко к тому, что Application в Android. viewDidLoad, viewDidDisappear сопоставимо с жизненным циклом Android. Каждое приложение имеет жизненный цикл - от запуска до прерывания от входящих вызовов до появления уведомлений. Если вам нужно, чтобы ваш код делал что-то особенное, когда происходят эти system события, вам нужно написать код методами.

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

1 голос
/ 10 февраля 2016

Надеюсь, это поможет немного больше ...

У программистов, плохо знакомых с этим языком, всегда один и тот же вопрос - программа запускается с основного метода? Да, вы правы в этом случае; Приложения IOS также начинаются с основного метода.
Ваш основной класс вызывает следующую функцию:

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

UIApplicationMain запускает цикл запуска Cocoa Touch и инфраструктуру приложения, которая создает объект UIApplication. Наше приложение нуждается в контенте, поэтому для выполнения этой задачи target-c использует делегат. Вот почему мы называем это AppDelegate (выступать в качестве делегата UIApplication). Мы реализуем некоторые необязательные методы этого делегата, и он ведет себя соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...