Question

Je crée une application iPhone assez complexe en utilisant Core Data. Jusqu'à présent, les choses ont fonctionné très bien. Comme l'application a été devient cependant plus complexe, un nouveau problème est venu: le premier contrôleur de vue termine sa méthode viewDidLoad avant la AppDelegate obtient même la moitié de sa méthode applicationDidFinishLaunching.

Le contrôleur de vue n'est pas la racine, qui est un contrôleur de barre d'onglets. Le VC en question est celle de l'onglet sélectionné par défaut dans la barre d'onglet. Il devient instancié par IB.

Rien de tout cela a eu lieu avant mon expérience, et il se débarrassant de l'initialisation importante que je fais dans les AppDelegate (obtenir des objets à partir des données de base et de les préparer à l'emploi). En outre, il est intermittent - parfois le délégué fait arrivée en premier.

Quelqu'un at-il remarqué une difficulté comme ça? Tout exemple de code qui traite cette question?

Je suppose que la réponse est de faire charger le VC les données que le AppDelegate se prépare uniquement lorsque le AppDelegate envoie un message qu'il est prêt. Je suis un peu inquiet que cela ajoute quelque chose qui va finir par me mordre dans le cul plus tard.

Était-ce utile?

La solution

La solution que je utilise pour éviter les conditions de course comme celui-ci est de renoncer complètement référence à une de l'interface fonctionnelle de l'application jusqu'à ce que les données ont été chargées et validées. Au sommet de ma -applicationDidFinishLaunching: méthode, je fais ce qui suit:

  1. Créer un UIWindow avec un sous-vue:
    • un UIImageView de Default.png avec un sous-vue:
      • un UIActivityIndicatorView centrée dans le cadre (et animant)
  2. Définir la clé de la fenêtre et visible afin que l'utilisateur obtient un retour visuel le plus rapidement possible que certains crissement de données est en cours avant le chargement de l'interface utilisateur.
  3. Faites tout votre chargement de données et de validation (qui pourrait inclure l'activité de réseau)
  4. Créer et ajouter la vue principale de l'interface utilisateur à la fenêtre comme un sous-vue juste en dessous de la vue Default.png, qui est ensuite disparu et enlevée de son superview.

Comment mettre en œuvre l'étape 4 (appel de sous-programme, la notification asynchrone, l'observation clé-valeur, etc ...) est entièrement à vous. Ce qui est important est l'idée de faire le chargement de tous les composants de l'interface utilisateur dépend de la charge de tous les composants de données nécessaires.

Cela vous permet d'écrire tout le code de l'interface utilisateur sans se soucier des données, ce qui est ce que vous voulez faire dans une application MVC de toute façon.

Autres conseils

Une fois l'initialisation du délégué de l'application est terminée, un feu NSNotification - ce serait la dernière chose que la méthode applicationDidFinishLaunching fera, sans doute.

Avoir le même délégué application pour écouter cette notification et le feu d'un sélecteur, dire loadViewController, qui charge alors le contrôleur de vue.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top