14 ответов:
создание параллельной очереди
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: .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 } } } }
скомпилирован в 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() } } } }
Я сделал это, и это особенно важно, если вы хотите обновить свой пользовательский интерфейс, чтобы показать новые данные, не замечая пользователя, как в UITableView или UIPickerView.
DispatchQueue.main.async { /*Write your thread code here*/ }
поскольку на вопрос OP уже был дан ответ выше, я просто хочу добавить некоторые соображения скорости:
очень важно, какой класс приоритета вы назначаете своей асинхронной функции в DispatchQueue.глобальный.
Я не рекомендую запускать задачи с помощью .фон приоритет потока, особенно на iPhone X, где задача, похоже, выделяется на ядрах с низким энергопотреблением.
вот некоторые реальные данные вычислительно интенсивная функция, которая читает из XML-файла (с буферизацией) и выполняет интерполяцию данных:
устройства / .фон/.утилита/.по умолчанию/.userInitiated/.в описании свойства userinteractive
- iPhone X: 18.7 s / 6.3 s / 1.8 s / 1.8 s / 1.8 s
- iPhone 7: 4.6 s / 3.1 s / 3.0 s / 2.8 s / 2.6 s
- iPhone 5s: 7.3 s / 6.1 s / 4.0 s / 4.0 s / 3.8 s
обратите внимание, что набор данных не является одинаковым для всех устройств. Это самый большой на iPhone X и самый маленький на iPhone 5s.
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 { self.collectionView?.reloadData() // Depends if you were populating a collection view or table view } OperationQueue.main.addOperation { self.lblGenre.text = self.movGenre }/ / используйте очередь операций, если вам нужно заполнить объекты (метки, imageview, textview) на вашем viewcontroller
Swift 3
вы хотите вызвать некоторое закрытие в swift-коде, тогда вы хотите изменить раскадровку ya любое изменение типа off принадлежит просмотру вашего приложения произойдет сбой
но вы хотите использовать метод отправки ваше приложение не будет аварийно
метод async
DispatchQueue.main.async { //Write code here }способ синхронизация
DispatchQueue.main.sync { //Write code here }
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 }
теперь это просто:
let serialQueue = DispatchQueue(label: "my serial queue")по умолчанию используется serial, чтобы получить concurrent, вы используете необязательный аргумент attributes .одновременно
вы можете создать очередь отправки с помощью этого кода в 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*/ }
Comments