Comment utiliser le filetage en swift?
dispatchOnMainThread:^{
NSLog(@"Block Executed On %s", dispatch_queue_get_label(dispatch_get_current_queue()));
}];
Comment utiliser le filetage en swift?
dispatchOnMainThread:^{
NSLog(@"Block Executed On %s", dispatch_queue_get_label(dispatch_get_current_queue()));
}];
]
devant le point-virgule dans la dernière ligne?DispatchQueue.global(qos: .background).async { print("Run on background thread") DispatchQueue.main.async { print("We finished that.") // only back on the main thread, may you access UI: label.text = "Done." } }
Réponses:
Swift 3.0+
Beaucoup a été modernisé dans Swift 3.0. Exécuter quelque chose sur le thread d'arrière-plan ressemble à ceci:
Swift 1,2 à 2,3
Pre Swift 1.2 - Problème connu
À partir de Swift 1.1, Apple ne prenait pas en charge la syntaxe ci-dessus sans quelques modifications. Passer
QOS_CLASS_BACKGROUND
n'a pas vraiment fonctionné, au lieu de cela utiliserInt(QOS_CLASS_BACKGROUND.value)
.Pour plus d'informations, voir la documentation sur les pommes
la source
Async.background {}
La meilleure pratique consiste à définir une fonction réutilisable accessible plusieurs fois.
FONCTION RÉUTILISABLE:
par exemple quelque part comme AppDelegate.swift en tant que fonction globale.
Remarque: dans Swift 2.0, remplacez QOS_CLASS_USER_INITIATED.value ci-dessus par QOS_CLASS_USER_INITIATED.rawValue à la place
USAGE:
A. Pour exécuter un processus en arrière-plan avec un délai de 3 secondes:
B. Pour exécuter un processus en arrière-plan, puis exécutez une complétion au premier plan:
C. Pour retarder de 3 secondes - notez l'utilisation du paramètre d'achèvement sans paramètre d'arrière-plan:
la source
if(background != nil){ background!(); }
parbackground?()
une syntaxe un peu plus rapide?DispatchQueue.global(priority: Int(DispatchQoS.QoSClass.userInitiated.rawValue)).async {
mais cela lance une erreur commecannot invoke initializer for type 'Int' with an argument list of type '(qos_class_t)'
. Une solution de travail se trouve ici (DispatchQueue.global(qos: DispatchQoS.QoSClass.userInitiated).async
).Réponse de Dan Beaulieu dans swift5 (fonctionne également depuis swift 3.0.1).
Swift 5.0.1
Usage
la source
background
fermeture est très très très long (~ = infini). Cette méthode est conçue pour durer un temps fini: le temps nécessaire à l'exécution de votre tâche d'arrière-plan. Ainsi, lacompletion
fermeture sera appelée dès que le temps d'exécution de votre tâche d'arrière-plan + délai sera écoulé.Version Swift 3
Swift 3 utilise une nouvelle
DispatchQueue
classe pour gérer les files d'attente et les threads. Pour exécuter quelque chose sur le thread d'arrière-plan, vous utiliseriez:Ou si vous voulez quelque chose en deux lignes de code:
Vous pouvez également obtenir des informations détaillées sur GDC dans Swift 3 dans ce didacticiel .
la source
De Jameson QUAVE tutoriel
Swift 2
la source
Dans Swift 4.2 et Xcode 10.1
Nous avons trois types de files d'attente:
1. File d' attente principale : La file d'attente principale est une file d'attente série créée par le système et associée au thread principal de l'application.
2. File d' attente globale : La file d'attente globale est une file d'attente simultanée que nous pouvons demander en fonction de la priorité des tâches.
3. Files d'attente personnalisées: peuvent être créées par l'utilisateur. Les files d'attente simultanées personnalisées sont toujours mappées dans l'une des files d'attente globales en spécifiant une propriété de qualité de service (QoS).
Toutes ces files d'attente peuvent être exécutées de deux manières
1. Exécution synchrone
2. Exécution asynchrone
Depuis AppCoda: https://www.appcoda.com/grand-central-dispatch/
la source
.background
QoS ou.userInitiated
mais pour moi, cela a fonctionné avec.background
Swift 4.x
Mettez ceci dans un fichier:
puis appelez-le là où vous en avez besoin:
la source
Vous devez séparer les modifications que vous souhaitez exécuter en arrière-plan des mises à jour que vous souhaitez exécuter sur l'interface utilisateur:
la source
dispatch_async(dispatch_get_main_queue()) { // update some UI }
Est donc appelé lorsque l'instruction d'arrière-plan (Outer Block) a terminé son exécution?De bonnes réponses cependant, de toute façon je veux partager ma solution orientée objet. À jour pour swift 5 .
veuillez le vérifier: AsyncTask
Inspiré conceptuellement par AsyncTask d'Android, j'ai écrit ma propre classe dans Swift
AsyncTask permet une utilisation correcte et facile du thread d'interface utilisateur. Cette classe permet d'effectuer des opérations en arrière-plan et de publier les résultats sur le thread d'interface utilisateur.
Voici quelques exemples d'utilisation
Exemple 1 -
Exemple 2 -
Il a 2 types génériques:
BGParam
- le type du paramètre envoyé à la tâche lors de l'exécution.BGResult
- le type du résultat du calcul d'arrière-plan.Lorsque vous créez un AsyncTask, vous pouvez attribuer ces types à tout ce dont vous avez besoin pour entrer et sortir de la tâche en arrière-plan, mais si vous n'avez pas besoin de ces types, vous pouvez le marquer comme inutilisé en le définissant simplement sur:
Void
ou avec une syntaxe plus courte:()
Lorsqu'une tâche asynchrone est exécutée, elle passe par 3 étapes:
beforeTask:()->Void
invoquée sur le thread d'interface utilisateur juste avant l'exécution de la tâche.backgroundTask: (param:BGParam)->BGResult
invoqué sur le thread d'arrière-plan immédiatement aprèsafterTask:(param:BGResult)->Void
invoqué sur le thread d'interface utilisateur avec le résultat de la tâche d'arrière-planla source
Puisque la question OP a déjà été répondue ci-dessus, je veux juste ajouter quelques considérations de vitesse:
Je ne recommande pas d'exécuter des tâches avec la priorité de thread .background en particulier sur l'iPhone X où la tâche semble être allouée sur les cœurs de faible puissance.
Voici quelques données réelles d'une fonction de calcul intensif qui lit à partir d'un fichier XML (avec mise en mémoire tampon) et effectue une interpolation des données:
Nom du périphérique / .background / .utility / .default / .userInitiated / .userInteractive
Notez que l'ensemble de données n'est pas le même pour tous les appareils. C'est le plus grand sur l'iPhone X et le plus petit sur l'iPhone 5s.
la source
Swift 5
Pour vous faciliter la tâche, créez un fichier "DispatchQueue + Extensions.swift" avec ce contenu:
Utilisation:
la source
Grand Central Dispatch est utilisé pour gérer le multitâche dans nos applications iOS.
Vous pouvez utiliser ce code
Pour plus d'informations, utilisez ce lien: https://www.programminghub.us/2018/07/07/integrate-dispatcher-in-swift.html
la source
Fonction polyvalente pour le fil
Utilisez-le comme:
la source
J'aime vraiment la réponse de Dan Beaulieu, mais cela ne fonctionne pas avec Swift 2.2 et je pense que nous pouvons éviter ces déballages forcés!
la source
la source
dans Swift 4.2 cela fonctionne.
la source