Dans Swift 2, j'ai pu créer une file d'attente avec le code suivant:
let concurrentQueue = dispatch_queue_create("com.swift3.imageQueue", DISPATCH_QUEUE_CONCURRENT)
Mais cela ne se compile pas dans Swift 3.
Quelle est la meilleure façon d'écrire ceci dans Swift 3?
ios
swift3
xcode8
grand-central-dispatch
dispatch-after
Karthik Kumar
la source
la source
DispatchQueue(label: "your-label")
pour une file d'attente en série. Les paramètres supplémentaires ont tous des valeurs par défaut.Réponses:
Création d'une file d'attente simultanée
Créer une file d'attente série
Obtenir la file d'attente principale de manière asynchrone
Obtenir la file d'attente principale de manière synchrone
Pour obtenir l'un des fils d'arrière-plan
Xcode 8.2 beta 2:
Pour obtenir l'un des fils d'arrière-plan
Si vous souhaitez en savoir plus sur l'utilisation de ces files d'attente .Voir cette réponse
la source
attributes: .serial
lors de la création d' une file d' attente de série:let serialQueue = DispatchQueue(label: "queuename")
.Compile sous> = Swift 3 . Cet exemple contient la plupart de la syntaxe dont nous avons besoin.
QoS - nouvelle syntaxe de qualité de service
weak self
- perturber les cycles de rétentionsi l'individu n'est pas disponible, ne rien faire
async global utility queue
- pour la requête réseau, n'attend pas le résultat, c'est une file d'attente simultanée, le bloc (généralement) n'attend pas au démarrage. L'exception pour une file d'attente simultanée peut être, lorsque sa limite de tâches a été précédemment atteinte, puis la file d'attente se transforme temporairement en file d'attente série et attend jusqu'à ce qu'une tâche précédente dans cette file d'attente se termine.async main queue
- pour toucher l'interface utilisateur, le bloc n'attend pas le résultat, mais attend son emplacement au départ. La file d'attente principale est une file d'attente série.Bien sûr, vous devez ajouter une vérification d'erreur à cela ...
la source
guard
quiself
ne sont pasnil
en haut, de sorte qu'aucun du code est exécuté si elle estnil
, par exemple,guard strongSelf = self else { return }
..global(qos: .background)
pour IO (requête réseau). Utilisez.global(qos: .default)
ou à la.global(qos: .utility)
place.Compilé dans XCode 8, Swift 3 https://github.com/rpthomas/Jedisware
la source
Puisque la question OP a déjà été répondue ci-dessus, je veux juste ajouter quelques considérations de vitesse:
Cela fait beaucoup de différence quelle classe de priorité vous affectez à votre fonction asynchrone dans DispatchQueue.global .
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
J'ai fait cela et cela est particulièrement important si vous souhaitez actualiser votre interface utilisateur pour afficher de nouvelles données sans que l'utilisateur ne s'en rende compte comme dans UITableView ou UIPickerView.
la source
// utilisez Operation Queue si vous devez remplir les objets (labels, imageview, textview) sur votre viewcontroller
la source
J'ai retravaillé votre code dans Xcode 8, Swift 3 et les changements sont marqués contrairement à votre version Swift 2.
la source
Swift 3
vous voulez appeler une fermeture en code rapide puis vous voulez changer dans le storyboard ya tout type de changement appartient pour voir votre application va planter
mais vous souhaitez utiliser la méthode de répartition, votre application ne se bloquera pas
méthode asynchrone
méthode de synchronisation
la source
DispatchQueue.main.sync
File d'attente série:
File d'attente simultanée:
la source
Pour Swift 3
la source
la source
Mise à jour pour Swift 5
De la documentation Apple :
Paramètres
étiquette
Une étiquette de chaîne à attacher à la file d'attente pour l'identifier de manière unique dans les outils de débogage tels que les instruments, les échantillons, les photos de pile et les rapports de plantage. Étant donné que les applications, les bibliothèques et les frameworks peuvent tous créer leurs propres files d'attente de répartition, un style de dénomination DNS inversé (com.example.myqueue) est recommandé. Ce paramètre est facultatif et peut être NULL.
qos
Niveau de qualité de service à associer à la file d'attente. Cette valeur détermine la priorité à laquelle le système planifie les tâches à exécuter. Pour une liste des valeurs possibles, voir DispatchQoS.QoSClass.
les attributs
Les attributs à associer à la file d'attente. Incluez l'attribut concurrent pour créer une file d'attente de répartition qui exécute les tâches simultanément. Si vous omettez cet attribut, la file d'attente de répartition exécute les tâches en série.
autoreleaseFrequency
Fréquence de libération automatique des objets créés par les blocs que la file d'attente planifie. Pour une liste des valeurs possibles, voir DispatchQueue.AutoreleaseFrequency .
cible
La file d'attente cible sur laquelle exécuter les blocs. Spécifiez DISPATCH_TARGET_QUEUE_DEFAULT si vous souhaitez que le système fournisse une file d'attente appropriée pour l'objet actuel.
la source
c'est maintenant simplement:
la valeur par défaut est série, pour obtenir simultanément, vous utilisez l'argument facultatif des attributs .concurrent
la source
seiralQueue.async {}
. @tylemolla source
Vous pouvez créer une file d'attente de répartition à l'aide de ce code dans swift 3.0
la source