Comment faire du multithreading, de la concurrency ou du parallélisme dans iOS Swift?

Existe-t-il un moyen de créer un thread de travail dans Swift?, Par exemple, s'il existe une fonctionnalité majeure qui nécessite beaucoup de calculs et retarde le thread principal de quelques secondes, si je souhaite déplacer cette fonctionnalité vers un thread séparé ou un thread qui ne bloque pas le thread principal est-il un moyen de le faire avec Swift?

J'ai parcouru les composants basiques et avancés de la documentation Apple pour Swift mais il n'y a rien à propos de la concurrency ou du parallélisme, est-ce que quelqu'un sait quelque chose sur la façon de le faire (si possible)?

Ou vous pouvez également utiliser des files d'attente d'opérations. Dans Swift 3:

let queue = OperationQueue() queue.addOperation() { // do something in the background OperationQueue.main.addOperation() { // when done, update your UI and/or model on the main queue } } 

Soit ceci, ou GCD, qu'Andy a illustré , fonctionne bien.

Voir le guide de programmation de concurrency d'Apple pour les mérites relatifs des files d'attente d'opération et des files d'attente d'expédition (aka Grand Central Dispatch, GCD). Alors que ce guide illustre encore les exemples utilisant Objective-C, l'API et les concepts sont fondamentalement les mêmes dans Swift (il suffit d'utiliser la syntaxe de Swift). La documentation relative aux files d'attente GCD et d'exploitation dans Xcode décrit les API Objective-C et Swift.


En passant, vous remarquerez que dans l'exemple ci-dessus ainsi que la démonstration GCD d'Andy, nous avons utilisé des "fermetures traînantes". Par exemple, si vous regardez la définition addOperationWithBlock , cela est défini comme une fonction avec un paramètre qui est une "fermeture" (qui est analogue à un bloc dans Objective-C):

 func addOperation(_ block: @escaping () -> Swift.Void) 

Cela pourrait vous amener à supposer que vous l'invoqueriez comme suit:

 queue.addOperation({ // do something in the background }) 

Mais lorsque le dernier paramètre d'une fonction est une fermeture, la syntaxe de fermeture à la fin vous permet de sortir ce paramètre de fermeture final des parenthèses de la fonction, et de le déplacer après la fonction, ce qui donne:

 queue.addOperation() { // do something in the background } 

Et comme il n'y a plus rien dans les parenthèses, vous pouvez même aller plus loin et supprimer ces parenthèses vides:

 queue.addOperation { // do something in the background } 

Espérons que cela illustre comment interpréter les déclarations de fonction NSOperationQueue / OperationQueue et / ou GCD et les utiliser dans votre code.

Vous pouvez utiliser Grand Central Dispatch (GCD) pour ces tâches.

Ceci est un exemple de base:

 let backgroundQueue: dispatch_queue_t = dispatch_queue_create("com.a.identifier", DISPATCH_QUEUE_CONCURRENT) // can be called as often as needed dispatch_async(backgroundQueue) { // do calculations } // release queue when you are done with all the work dispatch_release(backgroundQueue)