2010-10-22 6 views
0

Je voudrais créer un View/Window qui effectue un chargement initial dans mon application. J'ai essayé quelque chose comme ceci:Création d'un écran de chargement personnalisé sur l'iPhone

StartWindow *start = [[StartWindow alloc] initWithNibName:@"Start" bundle:nil]; 

self.startWindow = start; 

[start release]; 

[window addSubview:startWindow.view]; 

Et en cas viewDidLoad à l'intérieur StartWindow pour le moment, je viens de [NSThread sleepForTimeInterval:3.0]; pour simuler mon chargement.

Le problème est que mon avis ne montre pas que après le fil fini de dormir. pourquoi?

Modifier

Le code ci-dessus est à l'intérieur didFinishLaunchingWithOptions.

+0

Je ne suis pas du tout sûr, mais ce résultat semble suggérer que l'événement viewDidLoad se déclenche avant que la vue ne soit visible. Pourquoi n'essayez-vous pas de dormir dans le gestionnaire viewDidAppear? –

Répondre

1

Parce que le cadre attend que vous avez terminé l'initialisation de la vue dans viewDidLoad. Si vous voulez que le chargement se fasse en arrière-plan, vous devez utiliser une sorte de fonction de traitement en arrière-plan, comme un thread séparé ou NSOperationQueue.

BTW, sleepForTimInterval ne fonctionne pas réellement dans un thread séparé. Il fait dormir le thread appelant (dans ce cas, le thread principal de l'interface utilisateur).

+0

Alors, y a-t-il quelque chose que je puisse faire pour le réparer? Je ne veux pas charger en arrière-plan, je veux afficher des informations sur le chargement après qu'il soit chargé, donc je veux attendre jusqu'à ce qu'il soit fini. –

+0

Ensuite, vous devez faire le travail dans un thread séparé, qui signale le thread principal quand c'est fait. Un thread de bas niveau peut le faire via 'execSelectorOnMainThread'. NSOperationQueue peut avoir ses propres mécanismes de signalisation, mais je ne m'en suis pas beaucoup servi. –

+0

Vous avez des exemples sur comment démarrer avec 'performSelectorOnMainThread'? Je ne pense toujours pas que cela résout mon problème. Une fois que cette vue a chargé et affiché les données, je les supprime et affiche une autre vue, c'est pourquoi je veux attendre qu'elle se termine. –

1

Le problème est que vous bloquez le thread principal et que le système d'exploitation ne peut pas actualiser la fenêtre et afficher votre nouvelle vue. Vous pouvez essayer d'effectuer le chargement dans un deuxième thread, ou, si vous avez besoin d'appeler beaucoup de fonctions non thread safe, vous pouvez démarrer le chargement après un court laps de temps via un NSTimer afin que l'OS ait le temps de rafraîchir le fenêtre.

Une autre méthode consiste à effectuer le chargement dans viewDidAppear: qui est invoqué lorsque la vue est affichée tandis que viewDidLoad est invoqué lorsque la vue est chargée à partir du fichier .nib.

+0

Même chose avec 'viewDidAppear'. –

+0

Si cela ne fonctionne pas dans viewDidAppear, vous pouvez essayer la méthode timer. Vous n'avez donc pas besoin de charger en arrière-plan, mais vous donnez le temps à l'OS de rafraîchir la fenêtre. – JustSid

Questions connexes