Как создать очередь отправки в Swift 3

В Swift 2 мне удалось создать очередь со следующим кодом:

let concurrentQueue = dispatch_queue_create("com.swift3.imageQueue", DISPATCH_QUEUE_CONCURRENT)

Но это не компилируется в Swift 3.

Каков предпочтительный способ записи в Swift 3?

Ответ 1

Создание параллельной очереди

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`
}

Если вы хотите узнать об использовании этих очередей. Посмотрите ответ

Ответ 2

Компилируется под 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
            }
        }
    }
}

Ответ 3

Скомпилировано в 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()
            }

        }
    }

}

Ответ 4

Поскольку на вопрос ОП уже был дан ответ, я просто хочу добавить некоторые соображения по поводу скорости:

Очень важно, какой приоритетный класс вы назначаете асинхронной функции в DispatchQueue.global.

Я не рекомендую запускать задачи с приоритетом потока .background, особенно на iPhone X, где кажется, что задача распределена по ядрам с низким энергопотреблением.

Вот некоторые реальные данные из вычислительно интенсивной функции, которая читает из файла XML (с буферизацией) и выполняет интерполяцию данных:

Имя устройства /.background/.utility/.default/.userInitiated/.userInteractive

  1. iPhone X: 18,7 с /6,3 с/1,8 с /1,8 с/1,8 с
  2. iPhone 7: 4,6 с /3,1 с/3,0 с /2,8 с/2,6 с
  3. iPhone 5s: 7,3 с /6,1 с/4,0 с /4,0 с/3,8 с

Обратите внимание, что набор данных не одинаков для всех устройств. Это самый большой на iPhone X и самый маленький на iPhone 5s.

Ответ 5

Я сделал это, и это особенно важно, если вы хотите обновить свой пользовательский интерфейс, чтобы показывать новые данные без уведомления пользователя, например, в UITableView или UIPickerView.

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

Ответ 6

 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
}

//используйте "Очередь операций", если вам нужно заполнить объекты (метки, изображения, текстовое представление) на вашем диспетчере просмотра

Ответ 7

   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.

Ответ 8

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
}

Ответ 9

Swift 3

вы хотите вызвать некоторую закрытие в быстром коде, тогда вы хотите изменить в раскадровке, когда любой тип смены изменится, чтобы увидеть, как ваше приложение выйдет из строя.

но вы хотите использовать метод отправки, приложение не будет аварийно

асинхронный метод

DispatchQueue.main.async 
{
 //Write code here                                   

}

метод синхронизации

DispatchQueue.main.sync 
{
     //Write code here                                  

}

Ответ 10

Для Swift 3

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

Ответ 11

 let newQueue = DispatchQueue(label: "newname")
 newQueue.sync { 

 // your code

 }

Ответ 12

теперь просто:

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

значение по умолчанию - серийное, для получения совпадения используется необязательный атрибут .concurrent

Ответ 13

DispatchQueue.main.async(execute: {
   // code
})

Ответ 14

Вы можете создать очередь отправки, используя этот код в 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*/
}