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

dans Swift 2, j'ai pu créer la 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?

346
demandé sur Karthik Kumar 2016-06-14 10:41:51

14 réponses

la Création d'un concurrent à la file d'attente

let concurrentQueue = DispatchQueue(label: "queuename", attributes: .concurrent)
concurrentQueue.sync {

}  

créer une file d'attente en série

let serialQueue = DispatchQueue(label: "queuename")
serialQueue.sync { 

}

Get file principale en mode asynchrone

DispatchQueue.main.async {

}

Get main queue synchronely

DispatchQueue.main.sync {

}

pour obtenir un des fils de fond

DispatchQueue.global(qos: .background).async {

}

Xcode 8.2 beta 2:

pour obtenir 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 .Voir cette réponse

989
répondu That lazy iOS Guy 웃 2017-08-25 16:43:49

Compile sous "151950920 Swift" 3 . Cet exemple contient la plupart de la syntaxe dont nous avons besoin.

QoS - nouvelle qualité de service de la syntaxe

weak self - perturber les cycles de rétention

si l'auto n'est pas disponible, ne rien faire

async global background queue - pour le réseau de la requête

async main queue - pour toucher L'UI.

bien sûr, vous devez ajouter quelques la vérification d'erreur...

DispatchQueue.global(qos: .background).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
            }
        }
    }
}
51
répondu t1ser 2017-07-26 13:09:32

compilé dans 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()
            }

        }
    }

}
29
répondu R Thomas 2016-11-18 21:41:45

j'ai fait cela et c'est particulièrement important si vous voulez rafraîchir votre UI pour afficher de nouvelles données sans que l'utilisateur s'en aperçoive, comme dans Uitablview ou UIPickerView.

    DispatchQueue.main.async
 {
   /*Write your thread code here*/
 }
6
répondu Asfand Shabbir 2017-01-22 18:18:38

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 assignez à votre fonction async dans DispatchQueue.mondial .

Je ne recommande pas d'exécuter des tâches avec le .background priorité de fil particulièrement sur l'iPhone X où la tâche semble être attribuée sur les noyaux de faible puissance.

voici quelques données réelles d'une fonction de calcul intensif qui lit à partir d'un fichier XML (avec buffering) et effectue l'interpolation de données:

nom du dispositif / .arrière-plan / .utilité / .par défaut / .userInitiated / .useinteractif

  1. iPhone x: 18.7 s / 6.3 s / 1.8 S / 1.8 S / 1.8 s
  2. iPhone 7: 4.6 s / 3.1 s / 3.0 s / 2.8 s / 2.6 s
  3. iPhone 5s: 7.3 s / 6.1 s / 4.0 s / 4.0 s / 3.8 s

notez que l'ensemble de données n'est pas le même pour tous les appareils. C'est le plus gros sur l'iPhone X et le plus petit sur l'iPhone 5s.

4
répondu Cosmin 2018-05-16 12:45:07
   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 changements sont marqués en contraste avec votre version Swift 2.

2
répondu gosborne3 2017-03-10 07:57:32
 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
}

/ / utiliser la file D'attente D'opération si vous avez besoin de peupler les objets(étiquettes, imageview, textview) sur votre viewcontroller

2
répondu Fritz Gerald Moran 2017-05-10 08:04:04

Swift 3

vous voulez appeler une certaine fermeture en code swift puis vous voulez changer en storyboard ya n'importe quel changement de type off appartient à voir votre application va planter

mais vous voulez utiliser la méthode de régulation de vol votre application ne s'écrasera pas

méthode async

DispatchQueue.main.async 
{
 //Write code here                                   

}

méthode de synchronisation

DispatchQueue.main.sync 
{
     //Write code here                                  

}
1
répondu Rob-4608 2017-05-18 09:46:06
DispatchQueue.main.async(execute: {

// write code

})

De Série De La File D'Attente :

let serial = DispatchQueue(label: "Queuename")

serial.sync { 

 //Code Here

}

file D'attente concurrente:

 let concurrent = DispatchQueue(label: "Queuename", attributes: .concurrent)

concurrent.sync {

 //Code Here
}
1
répondu Hitesh Chauhan 2017-05-19 07:42:24

Pour Swift 3

   DispatchQueue.main.async {
        // Write your code here
    }
1
répondu Joseph Mikko Manoza 2017-08-23 03:49:15
 let newQueue = DispatchQueue(label: "newname")
 newQueue.sync { 

 // your code

 }
0
répondu Deepnarain Rai 2017-10-12 07:37:21

il est tout simplement:

let serialQueue = DispatchQueue(label: "my serial queue")

la valeur par défaut est serial, pour obtenir concurrent, vous utilisez l'argument optionnel attributes .concurrent

-3
répondu tylernol 2016-09-10 00:36:05

vous pouvez créer une file d'attente d'expédition en utilisant ce code dans swift 3.0

DispatchQueue.main.async
 {
   /*Write your code here*/
 }

   /* or */

let delayTime = DispatchTime.now() + Double(Int64(0.5 * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC)                   
DispatchQueue.main.asyncAfter(deadline: delayTime)
{
  /*Write your code here*/
}
-3
répondu Nand Parikh 2017-05-05 15:20:17
DispatchQueue.main.async(execute: {
   // code
})
-3
répondu Hitesh Chauhan 2017-05-16 05:58:50