2009-06-25 7 views
1

Je suis un nouveau venu dans le développement de l'iPhone, mais je suis sur le point de publier ma première application (liée à un site Web que je gère). L'application nécessite une très grande base de données et en tant que tel, j'ai décidé de stocker uniquement les données les plus couramment utilisées, en récupérant les autres données via un appel de service Web JSON à partir de la base de données mon site fonctionne. En effectuant OK à l'aide du simulateur (en appuyant sur la base de données en direct), les recherches reposant sur l'appel de service Web prenaient plus de temps que je l'aurais espéré en cours d'exécution sur le téléphone. Ces appels paraissent bien pires comparés aux recherches natives qui sont instantanées. Pour réduire la différence relative que je voulais mettre dans un faux interstitiel (page avec indicateur d'activité) pour les recherches natives (les recherches de services Web en utilisent déjà un) mais j'ai eu un problème avec le timing des poussées du contrôleur de navigation lorsqu'il est combiné avec dormir (n). Quoi qu'il en soit, la section de recherche de mon application est un navController dans un onglet tabController. Lorsque vous essayez d'utiliser le code comme ceci:Utiliser le sommeil dans les applications iPhone (en particulier avec UINavigationController)

[[tabBarController.viewControllers objectAtIndex:0] pushViewController:(UIViewController *)waitingController animated:YES]; 
sleep(2);

Je trouve que la poussée attend toujours le sommeil pour terminer avant d'exécuter quand l'effet que je veux est le viewcontroller d'être poussé, puis l'application d'attendre deux secondes avant de continuer à simuler le processus de recherche. J'ai eu d'autres résultats étranges avec navController pushes, à quelques occasions, j'ai vécu ce qui semble être une fusion de deux viewcontrollers séparés quand celui que j'ai poussé comme interstitiel reste en place avec le contenu Seul le titre de celui que je veux pousser à sa place reste.

Je suis sûr qu'il y a un manque fondamental de compréhension de ma part à blâmer alors j'espère avoir un peu de conseils ici.

Cheers,

Alan.

Répondre

3

sleep(float) bloque le thread principal provoquant le gel de l'interface utilisateur. Vous devriez plutôt planifier une action à effectuer plus tard en utilisant -[NSObject performSelector:withObject:afterDelay:]

Exemple:

[label performSelector:@selector(setText:) withObject:@"Delayed Hello World!" afterDelay:2.0f]; 
+0

Merci! Cela a fonctionné parfaitement. Après avoir récupéré les données de la recherche native, j'appuie sur waitController (interstitiel), puis j'utilise performSelector avec un délai lors de l'appel de la méthode dans appDelegate qui charge les résultats. – alan

0

je chercherais à changer votre architecture et ne pas dormir sur le thread principal - pas une grande expérience utilisateur! Examinez l'utilisation de NSOperation pour contrôler vos interactions avec le service Web. Cela vous permettra de mettre en file d'attente les opérations et de les faire exécuter dans une séquence spécifique ou en parallèle. NSOperation est un moyen très simple de fournir des opérations de threads robustes - et vous pouvez choisir de rappeler le thread principal avec toutes les mises à jour que vous souhaitez effectuer.

Je pense que cette architecture vous aidera à améliorer l'interface utilisateur, mais une fois que vous aurez reconfiguré votre façon de penser, vous trouverez de nombreux autres avantages. NB: Il m'a fallu plusieurs fois pour vraiment comprendre NSOperation et NSOperationQueue - mais le temps que j'ai investi en valait vraiment la peine.

+0

Merci pour ça. Je vais me renseigner sur NSOperation. Bien que dans ce cas mon traitement de l'appel de service Web ne soit pas le problème. J'essaye de reproduire l'effet que je reçois avec l'appel de service Web d'avoir une page interstitielle lors de la recherche native. À votre santé. – alan

+0

Je pense toujours que vous ne devriez pas dormir sur le thread principal et que cela pourrait être la cause de vos problèmes - peut-être utiliser NSOperation pour gérer les changements de votre interface utilisateur - même si votre opération ne dort que 2 secondes avant de renvoyer un message à votre interface utilisateur pour faire la prochaine chose - je pense que ce sera mieux que de dormir sur le fil principal. – Grouchal

+0

Tout à fait d'accord, bien que j'utilise performSelector comme suggéré ci-dessus que je suppose simplement retarder une action plutôt que de dormir le fil. (Et oui, NSOperation me fait peur;) Bravo. – alan

Questions connexes