item color change ios swift3 xcode8 grand-central-dispatch dispatch-after

ios - color - Cómo crear cola de despacho en Swift 3



change navigation item title color (15)

Actualización para swift 5

Cola de serie

let serialQueue = DispatchQueue.init(label: "serialQueue") serialQueue.async { // code to execute }

Cola concurrente

let concurrentQueue = DispatchQueue.init(label: "concurrentQueue", qos: .background, attributes: .concurrent, autoreleaseFrequency: .inherit, target: nil) concurrentQueue.async { // code to execute }

De la documentación de Apple :

Parámetros

etiqueta

Una etiqueta de cadena para adjuntar a la cola para identificarla de forma exclusiva en herramientas de depuración, como instrumentos, muestras, disparos de pila e informes de fallos. Debido a que las aplicaciones, las bibliotecas y los marcos pueden crear sus propias colas de despacho, se recomienda un estilo de nomenclatura de DNS inverso (com.example.myqueue). Este parámetro es opcional y puede ser NULL.

qos

El nivel de calidad de servicio para asociar con la cola. Este valor determina la prioridad a la que el sistema programa tareas para su ejecución. Para obtener una lista de valores posibles, vea DispatchQoS.QoSClass.

atributos

Los atributos para asociar con la cola. Incluya el atributo concurrente para crear una cola de despacho que ejecute tareas simultáneamente. Si omite ese atributo, la cola de despacho ejecuta tareas en serie.

AutoreleaseFrequency

La frecuencia con la que se liberan automáticamente los objetos creados por los bloques que la cola programa. Para obtener una lista de posibles valores, vea DispatchQueue.AutoreleaseFrequency .

objetivo

La cola de destino en la que ejecutar bloques. Especifique DISPATCH_TARGET_QUEUE_DEFAULT si desea que el sistema proporcione una cola que sea apropiada para el objeto actual.

En Swift 2, pude crear una cola con el siguiente código:

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

Pero esto no se compila en Swift 3.

¿Cuál es la forma preferida de escribir esto en Swift 3?


Como la pregunta OP ya ha sido respondida anteriormente, solo quiero agregar algunas consideraciones de velocidad:

Hace mucha diferencia qué clase de prioridad asigna a su función asíncrona en DispatchQueue.global .

No recomiendo ejecutar tareas con la prioridad de subproceso .background, especialmente en el iPhone X, donde la tarea parece estar asignada en los núcleos de baja potencia.

Aquí hay algunos datos reales de una función computacionalmente intensiva que se lee desde un archivo XML (con almacenamiento en búfer) y realiza la interpolación de datos:

Nombre del dispositivo / .background / .utility / .default / .userInitiated / .userInteractive

  1. iPhone X: 18.7s / 6.3s / 1.8s / 1.8s / 1.8s
  2. iPhone 7: 4.6s / 3.1s / 3.0s / 2.8s / 2.6s
  3. iPhone 5s: 7.3s / 6.1s / 4.0s / 4.0s / 3.8s

Tenga en cuenta que el conjunto de datos no es el mismo para todos los dispositivos. Es el más grande en el iPhone X y el más pequeño en el iPhone 5s.


Compila bajo Swift 3 . Este ejemplo contiene la mayor parte de la sintaxis que necesitamos.

QoS: nueva sintaxis de calidad de servicio

weak self - para interrumpir los ciclos de retención

si self no está disponible, no haga nada

async global background queue - para consulta de red

async main queue : para tocar la interfaz de usuario.

Por supuesto, debe agregar alguna comprobación de errores a esto ...

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


Compilado en 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() } } } }


Crear una cola concurrente

let concurrentQueue = DispatchQueue(label: "queuename", attributes: .concurrent) concurrentQueue.sync { }

Crear una cola en serie

let serialQueue = DispatchQueue(label: "queuename") serialQueue.sync { }

Obtener la cola principal de forma asincrónica

DispatchQueue.main.async { }

Obtener la cola principal sincrónicamente

DispatchQueue.main.sync { }

Para obtener uno de los hilos de fondo

DispatchQueue.global(qos: .background).async { }

Xcode 8.2 beta 2:

Para obtener uno de los hilos de fondo

DispatchQueue.global(qos: .default).async { } DispatchQueue.global().async { // qos'' default value is ´DispatchQoS.QoSClass.default` }

Si desea aprender sobre el uso de estas colas. Vea esta answer


Hice esto y esto es especialmente importante si desea actualizar su interfaz de usuario para mostrar nuevos datos sin que el usuario se dé cuenta como en UITableView o UIPickerView.

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


Para Swift 3

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


Puede crear la cola de despacho utilizando este código en 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*/ }


Swift 3

desea llamar a un cierre en el código rápido, luego desea cambiar en el guión gráfico y cualquier tipo de cambio pertenece para ver que su aplicación se bloqueará

pero desea utilizar el método de envío, su aplicación no se bloqueará

método asincrónico

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

método de sincronización

DispatchQueue.main.sync { //Write code here }


ahora es simplemente:

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

el valor predeterminado es serial, para obtener concurrencia, utiliza el argumento de atributos opcionales .concurrent


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

Modifiqué su código en Xcode 8, Swift 3 y los cambios están marcados en contraste con su versión Swift 2.


let newQueue = DispatchQueue(label: "newname") newQueue.sync { // your code }


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 }

// use Operation Queue si necesita llenar los objetos (etiquetas, vista de imagen, vista de texto) en su controlador de vista


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

Cola en serie:

let serial = DispatchQueue(label: "Queuename") serial.sync { //Code Here }

Cola concurrente:

let concurrent = DispatchQueue(label: "Queuename", attributes: .concurrent) concurrent.sync { //Code Here }


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