2017-03-07 6 views
1

J'ai une fonction comme ceci:Exécution de code à partir d'un fil spécifique à Swift

func foobar() { 
    let targetThread = Thread.current 

    DispatchQueue.main.async { 
    UIView.animate(withDuration: 0.5, animations: { 
     // Code I need to run on the main thread 
    }, completion: { 
     // Code I want to run on targetThread -- HOW? 
    } 
    } 
} 

Comment exécuter le code de targetThread? Merci.

+0

il vaudra mieux que vous créiez un nouveau thread à la place en utilisant le thread en cours d'exécution. et gardez un accès en dehors de la méthode, et démarrez-le lorsque vous appelez cette méthode. class var current: Thread Renvoie l'objet thread représentant le thread d'exécution en cours. – Deepak

+0

Pourquoi avez-vous besoin d'exécuter du code sur un thread spécifique? Vous ne devriez pas avoir à le faire et cela est découragé. Vous voulez probablement 'DispatchQueue.global(). Async' dans le bloc d'achèvement et y exécuter le code, mais laissez-nous savoir pourquoi vous voulez que le code s'exécute sur un thread cible. – Alistra

+1

Il est très fréquent de vouloir appeler les délégués sur le même fil qu'ils ont appelé. Malheureusement, gcd ne supporte pas vraiment cela. PerformSelector de NSObject: onThread peut être utilisé, mais ce n'est pas une API très propre. J'ai vu les programmes ont leur propre méthode performBlock: onThread qui utilise performSelector: onThread. – EricS

Répondre

1

DispatchQueue s ne sont pas des unités d'exécution. Vous remarquerez qu'il n'y a aucun moyen d'obtenir le DispatchQueue actuel de la façon dont vous pouvez obtenir le fil actuel. Si vous voulez juste d'exécuter du code quelque part qui n'est pas le thread principal, vous pouvez utiliser:

DispatchQueue.global().async { ... }

Si vous voulez vraiment cibler votre thread spécifique, vous avez deux choix.

Le premier est que vous pouvez utiliser NSObjectperform(_:on:with:waitUntilDone:) (ou l'une des méthodes connexes) et passez le NSThread vous avez obtenu. Il n'y a pas assez de contexte dans votre question pour dire si cela fonctionnera pour vous ou pour donner un exemple, mais vous pouvez chercher.

Le second est à nouveau travailler votre code qui commence tout cela d'utiliser un NSOperationQueue, donc foobar() serait exécuté dans une opération sur le NSOperationQueue puis dans votre fin de l'animation, vous souhaitez programmer une autre NSOperation pour fonctionner sur la même file d'attente d'opération. Vous pouvez également le faire en utilisant les files d'attente de répartition directement: c'est-à-dire créer votre propre file d'attente, envoyer foobar, puis renvoyer dans votre file d'attente à partir de main lorsque l'animation est terminée.