Для чего нужен AppDelegate и как узнать, когда его использовать?

146

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

resopollution
источник

Ответы:

255

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

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

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

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

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

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

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

Мэтт Галлахер
источник
8
+1 Это отличный ответ. Я просматривал некоторый пример кода, который имел подпредставления, вызывающие appDelegate, чтобы дать команду контроллеру представления переключиться на другое подпредставление, и это было похоже на запах кода. Приятно знать, что мой нос все еще работает.
Алан
2
иногда мы видим что-то подобное в онлайн-уроках: AppDelegate * del = [AppDelegate sharedAppDelegate]; (см. developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/… ) что это значит? я могу видеть примеры использования этого, но я действительно не понимаю теорию позади этого (см. этот пример: developer.apple.com/library/ios/#samplecode/… )
abbood
27

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

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

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

Эндрю Грант
источник
Я даю вам +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.
Шивам Бхалла
Спасибо, если вы можете лучше мой ответ, пожалуйста. Я удалю свой ответ после прочтения вашего.
Сиддхарт
1

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

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

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

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

Анураг Бхакуни
источник
пожалуйста, кто-то может заставить меня понять, что неправильно в ответе выше
Анураг Бхакуни
2
Это кажется смущенным, потому что а) вы не используете правильную пунктуацию / орфографию / грамматику, б) это не по теме, поскольку на самом деле не отвечает на вопрос, заданный оригинальным постером.
Кей