Utilisation de la veille dans les applications iPhone (notamment avec UINavigationController)

StackOverflow https://stackoverflow.com/questions/1042479

Question

Je suis assez nouveau dans le développement iPhone, mais je suis sur le point de publier ma première application (liée à un site Web que je dirige). L’application nécessite une très grande base de données. C’est pourquoi j’ai décidé de ne stocker que les données les plus utilisées, localement, en récupérant les autres données via un appel de service Web JSON à partir de la base de données sur laquelle mon site Web est créé.

Lors de l'exécution OK avec le simulateur (frappe de la base de données en direct), les recherches s'appuyant sur l'appel du service Web ont pris plus de temps que je ne l'aurais espéré lorsqu'elles étaient exécutées au téléphone. Ces appels semblent bien pires par rapport aux recherches natives instantanées. Pour réduire la différence relative, je souhaitais créer un faux interstitiel (page avec indicateur d'activité) pour les recherches natives (les recherches de service Web en utilisent déjà un), mais le problème de la synchronisation des pousses du contrôleur de navigation lorsqu'il est associé à 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 un code comme celui-ci:

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

Je constate que le push attend toujours la fin du sommeil avant de s'exécuter lorsque l'effet souhaité est de pousser le viewcontroller, puis l'application d'attendre deux secondes avant de continuer à simuler le processus de recherche.

J'ai eu d'autres résultats étranges avec les poussées navController. À quelques reprises, j'ai expérimenté ce qui semble être un brassage de deux contrôleurs de vue distincts lorsque celui que j'ai poussé en tant qu'interstitiel reste en place sur le contenu, avec seulement le titre de celui que je veux inséré reste à sa place.

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

A bientôt,

Alan.

Était-ce utile?

La solution

sleep (float) bloque le thread principal, ce qui bloque l'interface utilisateur. Vous devriez plutôt planifier une action à exécuter ultérieurement à l'aide de - [NSObject performSelector: withObject: afterDelay:]

Exemple:

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

Autres conseils

Je voudrais changer votre architecture et ne pas dormir sur le fil principal - ce n'est pas une expérience utilisateur formidable!

Envisagez d'utiliser 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 un ordre spécifique ou en parallèle.

NSOperation est un moyen très simple de fournir des opérations de threads robustes. Vous pouvez également rappeler le thread principal avec les mises à jour que vous souhaitez effectuer en cours de route.

Je pense que cette architecture vous aidera à améliorer considérablement l'interface utilisateur. Toutefois, une fois que vous aurez reconfiguré votre façon de penser pour utiliser des opérations, vous obtiendrez de nombreux autres avantages.

NB: Il m'a fallu plusieurs fois pour bien comprendre NSOperation et NSOperationQueue - mais le temps que j'ai investi en valait vraiment la peine.

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