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 compile pas dans Swift 3.
Quelle est la méthode préférée pour écrire ceci dans Swift 3?
Création d'une file d'attente simultanée
let concurrentQueue = DispatchQueue(label: "queuename", attributes: .concurrent)
concurrentQueue.sync {
}
Créer une file d'attente série
let serialQueue = DispatchQueue(label: "queuename")
serialQueue.sync {
}
Obtenir la file principale de manière asynchrone
DispatchQueue.main.async {
}
Obtenir la file principale de manière synchrone
DispatchQueue.main.sync {
}
Pour obtenir l'un des fils de fond
DispatchQueue.global(qos: .background).async {
}
Xcode 8.2 beta 2:
Pour obtenir l'un des fils de fond
DispatchQueue.global(qos: .default).async {
}
DispatchQueue.global().async {
// qos' default value is ´DispatchQoS.QoSClass.default`
}
Si vous voulez en savoir plus sur l'utilisation de ces files d'attente, voyez ceci réponse
Compile sous Swift. 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étention
si soi n'est pas disponible, ne fait rien
async global background queue
- pour une requête réseau
async main queue
- pour toucher l'interface utilisateur.
Bien sûr, vous devez ajouter une vérification d'erreur à cette ...
DispatchQueue.global(qos: .utility).async { [weak self] () -> Void in
guard let strongSelf = self else { return }
strongSelf.flickrPhoto.loadLargeImage { loadedFlickrPhoto, error in
if error != nil {
print("error:\(error)")
} else {
DispatchQueue.main.async { () -> Void in
activityIndicator.removeFromSuperview()
strongSelf.imageView.image = strongSelf.flickrPhoto.largeImage
}
}
}
}
Compilé en XCode 8, Swift 3 https://github.com/rpthomas/Jedisware
@IBAction func tap(_ sender: AnyObject) {
let thisEmail = "emailaddress.com"
let thisPassword = "myPassword"
DispatchQueue.global(qos: .background).async {
// Validate user input
let result = self.validate(thisEmail, password: thisPassword)
// Go back to the main thread to update the UI
DispatchQueue.main.async {
if !result
{
self.displayFailureAlert()
}
}
}
}
Étant donné que la question relative à l'OP a déjà été répondue ci-dessus, je souhaite simplement ajouter quelques considérations de rapidité:
La classe de priorité que vous affectez à votre fonction asynchrone dans DispatchQueue.global fait toute la différence.
Je ne recommande pas d'exécuter des tâches avec la priorité de fil . Background, en particulier sur l'iPhone X où la tâche semble être allouée sur les cœurs à faible consommation.
Voici quelques données réelles d'une fonction de calcul intensif qui lit un fichier XML (avec mise en mémoire tampon) et effectue une interpolation de données:
Nom du périphérique/. Fond/.util/. Défaut/. UserInitiated/. UserInteractive
Notez que le jeu 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 5.
C'est ce que j'ai fait et cela est particulièrement important si vous souhaitez actualiser votre interface utilisateur pour afficher les nouvelles données sans que l'utilisateur ne le remarque, comme dans UITableView ou UIPickerView.
DispatchQueue.main.async
{
/*Write your thread code here*/
}
DispatchQueue.main.async {
self.collectionView?.reloadData() // Depends if you were populating a collection view or table view
}
OperationQueue.main.addOperation {
self.lblGenre.text = self.movGenre
}
// utilisez Operation Queue si vous devez renseigner les objets (libellés, imageview, textview) sur votre contrôleur de vue
DispatchQueue.main.async(execute: {
// write code
})
File d'attente série:
let serial = DispatchQueue(label: "Queuename")
serial.sync {
//Code Here
}
File d'attente simultanée:
let concurrent = DispatchQueue(label: "Queuename", attributes: .concurrent)
concurrent.sync {
//Code Here
}
let concurrentQueue = dispatch_queue_create("com.Swift3.imageQueue", DISPATCH_QUEUE_CONCURRENT) //Swift 2 version
let concurrentQueue = DispatchQueue(label:"com.Swift3.imageQueue", attributes: .concurrent) //Swift 3 version
J'ai retravaillé votre code dans Xcode 8, Swift 3 et les modifications sont marquées contrairement à votre version Swift 2.
Swift 3
vous voulez appeler quelque fermeture dans le code Swift, puis vous voulez changer de storyboard et tout type de changement appartient à afficher votre application va planter
mais vous voulez utiliser la méthode d'envoi votre application ne plantera pas
méthode async
DispatchQueue.main.async
{
//Write code here
}
méthode de synchronisation
DispatchQueue.main.sync
{
//Write code here
}
let newQueue = DispatchQueue(label: "newname")
newQueue.sync {
// your code
}
Pour Swift 3
DispatchQueue.main.async {
// Write your code here
}
Mise à jour pour Swift 5
File d'attente série
let serialQueue = DispatchQueue.init(label: "serialQueue")
serialQueue.async {
// code to execute
}
File d'attente simultanée
let concurrentQueue = DispatchQueue.init(label: "concurrentQueue", qos: .background, attributes: .concurrent, autoreleaseFrequency: .inherit, target: nil)
concurrentQueue.async {
// code to execute
}
De documentation Apple :
Paramètres
étiquette
Étiquette de chaîne à attacher à la file d'attente pour l'identifier de manière unique dans des outils de débogage tels que Instruments, Sample, Stackshots et rapports d'incident. Étant donné que les applications, les bibliothèques et les infrastructures peuvent toutes 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 l'exécution des tâches. Pour obtenir une liste des valeurs possibles, voir DispatchQoS.QoSClass.
attributs
Les attributs à associer à la file d'attente. Incluez l'attribut simultané 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 planifiés par la file d'attente. Pour obtenir une liste des valeurs possibles, voir DispatchQueue.AutoreleaseFrequency .
cible
La file d'attente cible sur laquelle exécuter des blocs. Indiquez DISPATCH_TARGET_QUEUE_DEFAULT si vous souhaitez que le système fournisse une file d'attente appropriée pour l'objet actuel.