Comment accélérer mon application pour l'iPad?
-
29-09-2019 - |
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)
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?