Dans Swift 2, j'ai pu utiliser dispatch_after
pour retarder une action à l'aide de Grand Central Dispatch:
var dispatchTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(0.1 * Double(NSEC_PER_SEC)))
dispatch_after(dispatchTime, dispatch_get_main_queue(), {
// your function here
})
Mais cela ne semble plus se compiler depuis Swift 3. Quelle est la meilleure façon d'écrire ceci dans Swift moderne?
swift
swift4
grand-central-dispatch
swift5
brandonscript
la source
la source
UInt64
?Réponses:
La syntaxe est simplement:
Notez que la syntaxe ci-dessus de l'ajout en
seconds
tant que aDouble
semble être une source de confusion (d'autant plus que nous étions habitués à ajouter nsec). CetteDouble
syntaxe «ajouter des secondes en tant que » fonctionne car ildeadline
s'agit d'unDispatchTime
et, dans les coulisses, il existe un+
opérateur qui prendra unDouble
et ajoutera autant de secondes auDispatchTime
:Mais, si vous voulez vraiment ajouter un nombre entier de ms, μs ou nsec au
DispatchTime
, vous pouvez également ajouter unDispatchTimeInterval
à unDispatchTime
. Cela signifie que vous pouvez faire:Tout cela fonctionne parfaitement grâce à cette méthode de surcharge distincte pour l'
+
opérateur de laDispatchTime
classe.Il a été demandé comment procéder pour annuler une tâche envoyée. Pour ce faire, utilisez
DispatchWorkItem
. Par exemple, cela démarre une tâche qui se déclenchera dans cinq secondes, ou si le contrôleur de vue est rejeté et désalloué,deinit
il annulera la tâche:Notez l'utilisation de la
[weak self]
liste de capture dans leDispatchWorkItem
. Ceci est essentiel pour éviter un cycle de référence fort. Notez également que cela n'effectue pas une annulation préventive, mais arrête simplement la tâche de démarrer si ce n'est pas déjà fait. Mais s'il a déjà commencé au moment où il rencontre l'cancel()
appel, le bloc terminera son exécution (sauf si vous vérifiez manuellement l'isCancelled
intérieur du bloc).la source
DispatchTimeInterval
rendus, comme l'.milliseconds
exigentInt
. Mais si juste ajouter des secondes, j'utiliseraisDouble
, par exemplelet n: Double = 1.0; queue.asyncAfter(deadline: .now() + n) { ... }
.Swift 4:
Pour le moment
.seconds(Int)
,.microseconds(Int)
et.nanoseconds(Int)
peut également être utilisé.la source
.milliseconds
est meilleur que Double.DispatchTimeInterval
valeurs d'énumération.case seconds(Int)
case milliseconds(Int)
case microseconds(Int)
case nanoseconds(Int)
.milliseconds is better than Double.
- Je veux ça sur un T-shirt;).Si vous voulez juste que la fonction de retard
Swift 4 et 5
Vous pouvez l'utiliser comme:
la source
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1, execute: closure)
est plus simple.après la sortie de Swift 3, le @escaping doit également être ajouté
la source
Une saveur quelque peu différente de la réponse acceptée.
Swift 4
la source
Swift 4
Vous pouvez créer une extension sur DispatchQueue et ajouter un retard de fonction qui utilise la
DispatchQueue
fonction asyncAfter en interneet utilise
la source
appel
DispatchQueue.main.after(when: DispatchTime, execute: () -> Void)
Je recommande fortement d'utiliser les outils Xcode pour convertir en Swift 3 (Édition> Convertir> En syntaxe Swift actuelle). Il a attrapé ça pour moi
la source
Dans Swift 4.1 et Xcode 9.4.1
La réponse simple est ...
la source
Swift 5 et supérieur
la source
Aucune des réponses n'a mentionné de s'exécuter sur un thread non principal, ajoutant donc mes 2 cents.
Sur la file d'attente principale (thread principal)
OU
Sur file d'attente globale (thread non principal, basé sur QOS spécifié).
OU
la source
Cela a fonctionné pour moi dans Swift 3
la source
Vous pouvez utiliser
la source
essaye ça
la source