Question

Application Specific Information:
com.oneorangetree.iphoneexample failed to launch in time 
elapsed total CPU time (seconds): 3.500 (user 1.680, system 1.820), 17% CPU 
elapsed application CPU time (seconds): 0.920, 5% CPU

Lorsque les charges d'application, il fait beaucoup de choses dans viewDidLoad Il faut environ 30 secondes. Comment puis-je mettre cela dans un thread d'arrière-plan ou quelque chose pour accélérer l'application et éviter l'accident (parce qu'il a fallu trop de temps à charger)

Était-ce utile?

La solution

Je l'ai utilisé NSOperation / NSOperationQueue dans le passé pour le filetage simple. Plus précisément, NSInvocationOperation rend vraiment facile à tourner un appel de méthode qui prend un certain temps au large, et pratiquement NSOperationQueue fils pour vous. La méthode que vous fraie au large doit être thread-safe, mais ce n'est pas particulièrement difficile à faire. Par exemple, vous pouvez créer un NSOperationQueue dans vos méthodes de -init ou -viewDidLoad, puis ajoutez le NSInvocationOperation à la file d'attente et l'envoyer sur le chemin de lui.

NSOperationQueue *opQueue = [[NSOperationQueue alloc] init];
NSInvocationOperation *lengthyTask = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(processAddresses) object:nil];
[opQueue addOperation:lengthyTask];
[lengthyTask release];

L'une des choses cool un peu (surtout sur le bureau) est que le 10.6 (et iOS 4) Grand Central Dispatch est automatiquement utilisé.

Alors que le filetage une tâche longue devrait rendre votre application soit plus réactif (surtout si vous regardez les résultats et de les afficher comme ils viennent de la tâche filetée, peut-être avec KVO), il serait utile de mettre en œuvre une mise en cache. Rechargement le carnet d'adresses à chaque lancement serait très coûteux, en particulier la plupart des gens ne changent pas leurs carnets d'adresses beaucoup. Vous pouvez stocker les données calculées dans un fichier local ou la base de données (base de données est pas trop difficile à utiliser, et si elle est trop lent, vous pouvez utiliser SQLite directement). Puis, le lancement, vous pouvez exécuter à travers le carnet d'adresses, en comparant les dates de modification de chaque enregistrement de la dernière fois que votre application a été exécuté, géocodage les enregistrements nouvellement modifiés.

Autres conseils

Oui, vous pouvez utiliser un fil d'arrière-plan, mais une meilleure approche serait de précalculer (ou cache) les choses, si possible, de sorte que le temps de chargement est pas aussi longtemps. Quel genre de choses est votre code faisant cela prend tellement de temps à courir?

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