Je suis passé par l' iBook d'Apple et trouvé aucune définition de celui-ci:
Quelqu'un peut-il expliquer la structure de dispatch_after
?
dispatch_after(<#when: dispatch_time_t#>, <#queue: dispatch_queue_t?#>, <#block: dispatch_block_t?#>)
objective-c
swift
grand-central-dispatch
Kumar KL
la source
la source
Réponses:
Une idée plus claire de la structure:
dispatch_time_t
est unUInt64
. Ledispatch_queue_t
est en fait un alias de type pour unNSObject
, mais vous devez simplement utiliser vos méthodes GCD familières pour obtenir les files d'attente. Le bloc est une fermeture Swift. Plus précisément,dispatch_block_t
est défini comme() -> Void
, ce qui équivaut à() -> ()
.Exemple d'utilisation:
ÉDITER:
Je recommande d'utiliser la
delay
fonction vraiment sympa de @ matt .EDIT 2:
Dans Swift 3, il y aura de nouveaux wrappers pour GCD. Vois ici: https://github.com/apple/swift-evolution/blob/master/proposals/0088-libdispatch-for-swift3.md
L'exemple d'origine serait écrit comme suit dans Swift 3:
Notez que vous pouvez écrire la
deadlineTime
déclaration en tant queDispatchTime.now() + 1.0
et obtenir le même résultat car l'+
opérateur est remplacé comme suit (de même pour-
):func +(time: DispatchTime, seconds: Double) -> DispatchTime
func +(time: DispatchWalltime, interval: DispatchTimeInterval) -> DispatchWalltime
Cela signifie que si vous n'utilisez pas le
DispatchTimeInterval
enum
et écrivez simplement un nombre, on suppose que vous utilisez des secondes.la source
dispatch_after(1, dispatch_get_main_queue()) { println("test") }
1
dedispatch_after(1, ...
peut causer beaucoup de confusion. Les gens penseront qu'il s'agit d'un nombre de secondes, alors qu'il s'agit en fait de nano-secondes . Je suggère de voir la réponse de @brindy sur la façon de créer correctement ce numéro.1
endispatch_time(DISPATCH_TIME_NOW, Int64(1 * Double(NSEC_PER_SEC)))
car cela crée de la confusion. Les gens pourraient penser que vous n'avez pas besoin de créer un dispatch_time_t dans SwiftBinary operator '+' cannot be applied to operands of type DispatchTime and '_'
sur la lignelet delayTime = DispatchTime.now() + .seconds(1.0)
DispatchTime.now() + 1.0
semble être le seul moyen de le faire fonctionner (pas besoin.seconds
)J'utilise
dispatch_after
si souvent que j'ai écrit une fonction utilitaire de haut niveau pour simplifier la syntaxe:Et maintenant, vous pouvez parler comme ceci:
Wow, une langue où vous pouvez améliorer la langue. Qu'est-ce qui pourrait être mieux?
Mise à jour pour Swift 3, Xcode 8 Seed 6
Cela ne vaut presque pas la peine d'être dérangé, maintenant qu'ils ont amélioré la syntaxe d'appel:
la source
func delayInSec(delay: Double) -> dispatch_time_t { return dispatch_time(DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC))) }
return
).1.0 ~~ { code...}
Swift 3+
C'est super facile et élégant dans Swift 3+:
Réponse plus ancienne:
Pour développer la réponse de Cezary, qui s'exécutera après 1 nanoseconde, j'ai dû faire ce qui suit pour l'exécuter après 4 secondes et demie.
Edit: j'ai découvert que mon code d'origine était légèrement faux. Le typage implicite provoque une erreur de compilation si vous ne transtypez pas NSEC_PER_SEC en Double.
Si quelqu'un peut suggérer une solution plus optimale, je serais ravi de l'entendre.
la source
dispatch_get_current_queue()
. J'ai utilisé à ladispatch_get_main_queue()
place.dispatch_get_main_queue()
c'est certainement ce que vous devriez utiliser. Mettra à jour.La syntaxe de matt est très agréable et si vous devez invalider le bloc, vous pouvez utiliser ceci:
Utilisez comme suit
crédits
Le lien ci-dessus semble être en panne. Code Objc original de Github
la source
performSelector:afterDelay:
est désormais disponible dans Swift 2, vous pouvez donc l'annuler.dispatch_source_t
, car c'est quelque chose que vous pouvez annuler).Solution la plus simple dans Swift 3.0 & Swift 4.0 & Swift 5.0
Usage
la source
Apple a un extrait dispatch_after pour Objective-C :
Voici le même extrait porté sur Swift 3:
la source
Une autre façon est d'étendre Double comme ceci:
Ensuite, vous pouvez l'utiliser comme ceci:
J'aime la fonction de retard de matt mais juste par préférence, je préfère limiter les fermetures de passage.
la source
Dans Swift 3.0
Files d'attente de répartition
Envoi après 5 secondes
la source
Version Swift 3.0
La fonction de fermeture suivante exécute une tâche après un délai sur le thread principal.
Appelez cette fonction comme:
la source
1) Ajoutez cette méthode dans le cadre de l'extension UIViewController.
Appelez cette méthode sur VC:
2)
3)
// Forme compacte
la source
Bien qu'il ne s'agisse pas de la question d'origine du PO, certaines
NSTimer
questions connexes ont été marquées comme des doublons de cette question, il vaut donc la peine d'y inclure uneNSTimer
réponse ici.NSTimer
contredispatch_after
NSTimer
est de niveau plus élevé tandis quedispatch_after
est de niveau plus bas.NSTimer
est plus facile à annuler. L'annulationdispatch_after
nécessite l'écriture de plus de code .Retarder une tâche avec
NSTimer
Créez une
NSTimer
instance.Démarrez la minuterie avec le retard dont vous avez besoin.
Ajoutez une fonction à appeler après le délai (en utilisant le nom que vous avez utilisé pour le
selector
paramètre ci-dessus).Remarques
timer.invalidate()
.repeats: true
.Si vous avez un événement ponctuel sans avoir besoin d'annuler, il n'est pas nécessaire de créer la
timer
variable d'instance. Les éléments suivants suffiront:Voir ma réponse plus complète ici .
la source
Pour plusieurs fonctions, utilisez ceci. Ceci est très utile pour utiliser des animations ou un chargeur d'activité pour les fonctions statiques ou toute mise à jour de l'interface utilisateur.
Par exemple - Utilisez une animation avant un rechargement de tableView. Ou toute autre mise à jour de l'interface utilisateur après l'animation.
la source
Cela a fonctionné pour moi.
Swift 3:
Objectif c:
la source
Swift 3 & 4:
Vous pouvez créer une extension sur DispatchQueue et ajouter un retard de fonction qui utilise la fonction asyncAfter de DispatchQueue en interne
utilisation:
la source
Un autre assistant pour retarder votre code qui est 100% Swift dans l'utilisation et permet éventuellement de choisir un thread différent pour exécuter votre code retardé à partir de:
Maintenant, vous retardez simplement votre code sur le fil principal comme ceci:
Si vous souhaitez retarder votre code sur un autre thread :
Si vous préférez un Framework qui possède également des fonctionnalités plus pratiques, passez à HandySwift . Vous pouvez l'ajouter à votre projet via Carthage puis l'utiliser exactement comme dans les exemples ci-dessus, par exemple:
la source
Je préfère toujours utiliser l'extension au lieu des fonctions gratuites.
Swift 4
Utilisez comme suit.
la source
Retarder l'appel GCD en utilisant asyncAfter dans swift
Nous pouvons retarder comme ** microsecondes , millisecondes , nanosecondes
la source
Dans Swift 4
Utilisez cet extrait:
la source
La
dispatch_after(_:_:_:)
fonction prend trois paramètres:La
dispatch_after(_:_:_:)
fonction appelle le bloc ou la fermeture de la file d'attente de répartition qui est passé à la fonction après un délai donné. Notez que le retard est créé à l'aide de ladispatch_time(_:_:)
fonction. N'oubliez pas ceci car nous utilisons également cette fonction dans Swift.Je recommande de suivre le tutoriel Raywenderlich Dispatch tutorial
la source
Dans Swift 5, utilisez ce qui suit:
la source
utilisez ce code pour effectuer une tâche liée à l'interface utilisateur après 2,0 secondes.
Version Swift 3.0
La fonction de fermeture suivante exécute une tâche après un délai sur le thread principal.
Appelez cette fonction comme:
la source
Maintenant plus que du sucre syntaxique pour les envois asynchrones dans Grand Central Dispatch (GCD) dans Swift.
ajouter Podfile
Ensuite, vous pouvez l'utiliser comme ça.
la source
Swift 4 a un moyen assez court de le faire:
la source
Voici la version synchrone de asyncAfter dans Swift:
Avec un asynchrone:
la source