web-dev-qa-db-fra.com

Comment créer une file d'attente dans Swift 3

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?

385
user4790024

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

1089
LC 웃

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
            }
        }
    }
}
54
t1ser

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()
            }

        }
    }

}
28
R Thomas

É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

  1. iPhone X: 18,7s/6,3s/1,8s/1,8s/1,8s
  2. iPhone 7: 4.6s/3.1s/3.0s/2.8s/2.6s
  3. iPhone 5s: 7.3s/6.1s/4.0s/4.0s/3.8s

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.

9
Cosmin

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*/
 }
6
Asfand Shabbir
 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

3
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
}
2
Hitesh Chauhan
   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.

2
gosborne3

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                                  

}
2
Amul4608
 let newQueue = DispatchQueue(label: "newname")
 newQueue.sync { 

 // your code

 }
1
Deep

Pour Swift 3

   DispatchQueue.main.async {
        // Write your code here
    }
0
Joseph Mikko Manoza

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.

0
Mithra Singam