В 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*/
}