web-dev-qa-db-fra.com

Aide avec le multi-threading sur iOS?

J'ai une application qui utilise OpenEars et la bibliothèque Flite. Le problème est que la bibliothèque Flite consomme beaucoup de ressources et gèle mon application. Je soupçonne que l'exécution de Flite sur un thread d'arrière-plan résoudra les problèmes, mais je n'ai aucune idée de le faire.

Cela dit, ( comment puis-je implémenter un fil d'arrière-plan dans iOS ?

J'apprécierais que quelqu'un me pointe vers des didacticiels, partage un exemple de code ou des conseils généraux qui pourraient m'aider à résoudre ce problème.

25
Moshe

Le Guide de programmation d'accès concurrentiel par Apple est une bonne lecture. La programmation simultanée n'est pas quelque chose que vous pourriez vouloir ramasser en copiant un exemple de code à partir du Web et en piratant jusqu'à ce que vous sont heureux. Il est bon de connaître les options et les principes pour vous éviter des ennuis.


En réexaminant la réponse après un certain temps, de nos jours, vous ne pouvez presque pas vous tromper en utilisant Grand Central Dispatch. L'exécution d'une tâche en arrière-plan ressemble à ceci:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    [self doSomeLongTask]; // 1
    dispatch_async(dispatch_get_main_queue(), ^{
        [self longTaskDidFinish]; // 2
    });
});

La tâche longue (1) s'exécutera sur un thread d'arrière-plan et il n'y a pas de capture à ma connaissance, c'est-à-dire. il y a déjà un pool de libération automatique dans ce thread, vous n'avez pas à vous soucier des boucles d'exécution, etc. Une fois la tâche terminée, le code appelle -longTaskDidFinish sur le thread principal (2), afin que vous puissiez mettre à jour l'interface utilisateur ou quoi que ce soit d'autre. C'est un idiome souvent utilisé.

45
zoul

La meilleure chose à faire est peut-être ce tutoriel d'Apple . Je l'ai lu attentivement (10-20 minutes) et "enfilé" toute ma candidature! Excellent!

6
EDUARDO CAPANEMA

Swift 3

DispatchQueue.global(qos: .userInteractive).async {
    // Code to run on background thread

    // Switch to the main UI thread to display any results needed
    DispatchQueue.main.async {
        // Run code on main UI thread here
    }
}

Le paramètre qos signifie "Qualité de service". Considérez-le comme une priorité pour donner à votre fil de fond:

  • .userInteractive (priorité la plus élevée)
  • .userInitiated (quand vous pouvez épargner quelques secondes)
  • .utility (quand vous pouvez épargner quelques secondes à quelques minutes)
  • .background (priorité la plus faible - minutes/heures à perdre)
1
Mark Moeykens