Para que serve o AppDelegate e como sei quando usá-lo?

146

Estou apenas começando a trabalhar em aplicativos para iPhone. Como sei quando devo colocar coisas no AppDelegate versus uma classe personalizada? Existe uma regra ou qualquer tipo de analogia com outra linguagem de programação como Python ou PHP que usa um padrão semelhante ao AppDelegate?

ressopoluição
fonte

Respostas:

255

Normalmente, evito a abordagem de design implícita pelo uso do termo "coração do seu aplicativo" por Andrew. O que quero dizer com isso é que acho que você deve evitar agrupar muitas coisas em um local central - um bom design de programa normalmente envolve a separação da funcionalidade por "área de preocupação".

Um objeto delegado é um objeto que é notificado quando o objeto ao qual está conectado atinge determinados eventos ou estados. Nesse caso, o Application Delegate é um objeto que recebe notificações quando o objeto UIApplication atinge determinados estados. Em muitos aspectos, é um padrão de Observador um para um especializado.

Isso significa que a "área de preocupação" para o AppDelegate está lidando com estados especiais do UIApplication. Os mais importantes são:

  • applicationDidFinishLaunching: - bom para manipular configuração e construção na inicialização
  • applicationWillTerminate: - bom para limpar no final

Você deve evitar colocar outras funcionalidades no AppDelegate, pois elas realmente não pertencem a ele. Essa outra funcionalidade inclui:

  • Dados do documento - você deve ter um singleton do gerenciador de documentos (para vários aplicativos de documento) ou um singleton de documento (para aplicativos de documento único)
  • Controladores de botão / tabela / exibição, métodos de delegação de exibição ou outro tratamento de exibição (exceto para a construção da exibição de nível superior em applicationDidFinishLaunching :) - este trabalho deve estar nas respectivas classes de controlador de exibição.

Muitas pessoas colocam essas coisas no AppDelegate porque são preguiçosas ou acham que o AppDelegate controla todo o programa. Você deve evitar centralizar no AppDelegate, pois ele atrapalha as áreas de preocupação no aplicativo e não aumenta.

Matt Gallagher
fonte
8
+1 Esta é uma excelente resposta. Eu estava olhando para um código de exemplo que as subvisões chamam de appDelegate para instruir um controlador de exibição a mudar para uma subview diferente, e parecia um cheiro de código. É bom saber que meu nariz ainda funciona.
Alan
2
às vezes, vemos algo assim nos tutoriais on-line: AppDelegate * del = [AppDelegate sharedAppDelegate]; (consulte developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/… ) o que isso significa? posso ver exemplos de como usá-lo, mas realmente não entendo a teoria por trás dele (veja este exemplo: developer.apple.com/library/ios/#samplecode/… )
abbood
27

O delegado do seu aplicativo é o coração do seu aplicativo. É efetivamente o seu "Controlador de Programa".

O Delegado do Aplicativo é a classe que recebe mensagens no nível do aplicativo, incluindo a mensagem applicationDidFinishLaunching mais comumente usada para iniciar a criação de outras visualizações.

Embora não seja exatamente semelhante, você pode pensar nisso como a rotina "main ()" do seu programa de cacau.

Andrew Grant
fonte
Estou dando +1 a você porque ter todos os seus controladores de interface do usuário no AppDelegate é menos trabalhoso do que criar todas essas classes personalizadas para ele.
Rwols
3
O @rwols seja cuidadoso, separar suas preocupações ajuda a um código mais limpo e é menos trabalhoso depurar. Você deve criar um tempo para criar essa classe personalizada e não colocar todos os seus observadores em um único arquivo.
Wheeliez 17/03/2015
2

@Shivam, obrigado.

Pelo que entendi appDelegate, está próximo do que Applicationestá no Android. O viewDidLoad, viewDidDisappearé comparável ao ciclo de vida do Android. Todo aplicativo tem um ciclo de vida, desde o lançamento até as interrupções das chamadas recebidas e as notificações que aparecem. Se você precisar do seu código para fazer algo especial quando essessystem eventos ocorrerem, será necessário escrever os métodos nos códigos.

Em Android usamos onPause, onDestroy, onCreatecallback meio de métodos para lidar com tais eventos do sistema.

Siddharth
fonte
Os onPause, onCreatee onDestroymétodos de Android são mais semelhantes ao viewDidDisappear, viewDidLoadmétodos de ciclo de vida de um modo de exibição do controlador iOS. Se você tiver que comparar, eu diria que a Applicationclasse do Android estaria mais próxima da AppDelegatedo iOS.
Shivam Bhalla
Obrigado, se você puder melhorar minha resposta, por favor. Excluirei minha resposta depois de ler a sua.
Siddharth
1

Espero que isso ajude um pouco mais ...

Os programadores iniciantes nesse idioma sempre têm a mesma pergunta - o programa começa com um método principal? Sim, você está certo neste caso; Os aplicativos IOS também iniciam a partir de um método principal.
Sua classe principal chama a função abaixo:

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

O UIApplicationMain inicia o loop de execução do Cocoa Touch e a infraestrutura do aplicativo que cria um UIApplicationobjeto. Nosso aplicativo precisa de conteúdo, de modo que o objetivo-c use um representante para lidar com isso. É por isso que chamamos AppDelegate (atuar como delegado de UIApplication). Implementamos alguns dos métodos opcionais desse delegado e ele se comporta de acordo.

Anurag Bhakuni
fonte
Por favor, alguém pode me fazer entender errado whts na resposta acima
Anurag Bhakuni
2
Parece confuso porque: a) você não usa pontuação / ortografia / gramática apropriadas; b) é fora do tópico, pois não responde de fato à pergunta que o pôster original fez.
Kay