Как создать очередь отправки в Swift 3
в Swift 2, я смог создать очередь следующим кодом:
let concurrentQueue = dispatch_queue_create("com.swift3.imageQueue", DISPATCH_QUEUE_CONCURRENT)
но это не компилируется в Swift 3.
каков предпочтительный способ написать это в Swift 3?
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
- нарушить сохранение циклов
если 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-коде, то вы хотите изменить в раскадровке я Любой тип от изменения принадлежат для просмотра вашего приложения будет сбой
но вы хотите использовать метод отправки, ваше приложение не рухнет
метод 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*/
}