В Swift 2 мне удалось создать очередь со следующим кодом:
let concurrentQueue = dispatch_queue_create("com.swift3.imageQueue", DISPATCH_QUEUE_CONCURRENT)
Но это не компилируется в Swift 3.
Каков предпочтительный способ записи в Swift 3?
В Swift 2 мне удалось создать очередь со следующим кодом:
let concurrentQueue = dispatch_queue_create("com.swift3.imageQueue", DISPATCH_QUEUE_CONCURRENT)
Но это не компилируется в Swift 3.
Каков предпочтительный способ записи в Swift 3?
Создание параллельной очереди
let concurrentQueue = DispatchQueue(label: "queuename", attributes: .concurrent)
concurrentQueue.sync {
}  
Создать последовательную очередь
let serialQueue = DispatchQueue(label: "queuename")
serialQueue.sync { 
}
Асинхронно получать основную очередь
DispatchQueue.main.async {
}
Получить основную очередь синхронно
DispatchQueue.main.sync {
}
Чтобы получить один из фоновых потоков
DispatchQueue.global(qos: .background).async {
}
Xcode 8.2 beta 2:
Чтобы получить один из фоновых потоков
DispatchQueue.global(qos: .default).async {
}
DispatchQueue.global().async {
    // qos' default value is ´DispatchQoS.QoSClass.default`
}
Если вы хотите узнать об использовании этих очередей. Посмотрите ответ
Компилируется под Swift 3. Этот пример содержит большую часть синтаксиса, который нам нужен.
QoS - новый синтаксис качества обслуживания
 weak self - чтобы нарушить сохранение циклов
если личность недоступна, ничего не делай
 async global background queue - для сетевого запроса
 async main queue - для прикосновения к интерфейсу.
Конечно, вам нужно добавить некоторые проверки ошибок к этому...
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
            }
        }
    }
}
Скомпилировано в 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()
            }
        }
    }
}
Поскольку на вопрос ОП уже был дан ответ, я просто хочу добавить некоторые соображения по поводу скорости:
Очень важно, какой приоритетный класс вы назначаете асинхронной функции в DispatchQueue.global.
Я не рекомендую запускать задачи с приоритетом потока .background, особенно на iPhone X, где кажется, что задача распределена по ядрам с низким энергопотреблением.
Вот некоторые реальные данные из вычислительно интенсивной функции, которая читает из файла XML (с буферизацией) и выполняет интерполяцию данных:
Имя устройства /.background/.utility/.default/.userInitiated/.userInteractive
Обратите внимание, что набор данных не одинаков для всех устройств. Это самый большой на iPhone X и самый маленький на iPhone 5s.
Я сделал это, и это особенно важно, если вы хотите обновить свой пользовательский интерфейс, чтобы показывать новые данные без уведомления пользователя, например, в UITableView или 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
}
//используйте "Очередь операций", если вам нужно заполнить объекты (метки, изображения, текстовое представление) на вашем диспетчере просмотра
   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
Я переработал ваш код в Xcode 8, Swift 3, и изменения отмечены в отличие от вашей версии Swift 2.
DispatchQueue.main.async(execute: {
// write code
})
Последовательная очередь:
let serial = DispatchQueue(label: "Queuename")
serial.sync { 
 //Code Here
}
Параллельная очередь:
 let concurrent = DispatchQueue(label: "Queuename", attributes: .concurrent)
concurrent.sync {
 //Code Here
}
Swift 3
вы хотите вызвать некоторую закрытие в быстром коде, тогда вы хотите изменить в раскадровке, когда любой тип смены изменится, чтобы увидеть, как ваше приложение выйдет из строя.
но вы хотите использовать метод отправки, приложение не будет аварийно
асинхронный метод
DispatchQueue.main.async 
{
 //Write code here                                   
}
метод синхронизации
DispatchQueue.main.sync 
{
     //Write code here                                  
}
Для Swift 3
   DispatchQueue.main.async {
        // Write your code here
    }
 let newQueue = DispatchQueue(label: "newname")
 newQueue.sync { 
 // your code
 }
теперь просто:
let serialQueue = DispatchQueue(label: "my serial queue")
значение по умолчанию - серийное, для получения совпадения используется необязательный атрибут .concurrent
DispatchQueue.main.async(execute: {
   // code
})
Вы можете создать очередь отправки, используя этот код в 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*/
}