Pergunta

Eu estou criando um aplicativo bastante complexo iPhone usando Core Data. Até agora, as coisas foram funcionando bem. Como o aplicativo foi ficando cada vez mais complexo, no entanto, um novo problema surgiu: o primeiro controlador de vista está terminando seu método viewDidLoad antes do AppDelegate fica ainda a meio do método applicationDidFinishLaunching.

O controlador de vista não é a raiz, que é um controlador de barra de abas. O VC em questão é o único para a guia padrão selecionada na barra de abas. Está ficando instanciado pelo IB.

Nada como isso ocorreu antes na minha experiência, e ele está jogando fora a inicialização importante que eu estou fazendo na AppDelegate (ficando objetos de Core Data e preparando-os para uso). Além disso, é intermitente - às vezes o delegado faz chegada em primeiro lugar.

Tem mais alguém notou uma dificuldade como este? Qualquer código de exemplo que lida com essa questão?

Suponho que a resposta é fazer o VC carregar os dados que o AppDelegate está se preparando apenas quando o AppDelegate envia uma mensagem que ele está pronto. Estou um pouco preocupado que isso está adicionando algo que só vai acabar me morder na bunda mais tarde.

Foi útil?

Solução

A solução que eu estou usando a condições de evitar corrida como essa é a referência completamente rejeitar qualquer da UI funcional do aplicativo até que os dados tenham sido carregados e validado. No topo da minha -applicationDidFinishLaunching: método, eu faço o seguinte:

  1. Criar um UIWindow com um subexibição:
    • um UIImageView de Default.png com um subexibição:
      • um UIActivityIndicatorView centrado na armação (e animar)
  2. Definir chave janela e visível para o usuário recebe feedback visual mais rapidamente possível que alguns dados de trituração está acontecendo antes de as cargas de interface do usuário.
  3. Faça todo o seu carregamento de dados e validação (que poderia incluir a atividade de rede)
  4. Criar e adicionar vista principal da interface do usuário para a janela como um direito subexibição abaixo da vista Default.png, que então é desapareceu e removido de sua superview.

Como você implementar a etapa 4 (chamada de subrotina, a notificação assíncrona, a observação de valores-chave, etc ...) é inteiramente até você. O que é importante é a idéia de fazer o carregamento de qualquer contingente componentes de interface do usuário sobre o carregamento de quaisquer componentes de dados necessários.

Isso permite que você escreva todo o seu código UI sem se preocupar com os dados, que é o que você quer fazer em um aplicativo MVC de qualquer maneira.

Outras dicas

Uma vez que a inicialização do aplicativo delegado está terminado, disparar um NSNotification - isso seria última coisa que o método applicationDidFinishLaunching vai fazer, presumivelmente.

Ter o mesmo delegado app para ouvir que a notificação e disparar um seletor, dizem loadViewController, que, em seguida, carrega o controlador de vista.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top