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?
ios
swift3
xcode8
grand-central-dispatch
dispatch-after
Karthik Kumar
fuente
fuente
DispatchQueue(label: "your-label")
para una cola serial. Todos los parámetros adicionales tienen valores predeterminados.Respuestas:
Crear una cola concurrente
Crear una cola en serie
Obtener la cola principal de forma asincrónica
Obtener la cola principal sincrónicamente
Para obtener uno de los hilos de fondo
Xcode 8.2 beta 2:
Para obtener uno de los hilos de fondo
Si desea aprender sobre el uso de estas colas. Vea esta respuesta
fuente
attributes: .serial
cuando se crea una cola de serie:let serialQueue = DispatchQueue(label: "queuename")
.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ónsi self no está disponible, no haga nada
async global utility queue
- para consulta de red, no espera el resultado, es una cola concurrente, el bloque (generalmente) no espera cuando se inicia. La excepción para una cola concurrente podría ser, cuando su límite de tarea se ha alcanzado previamente, entonces la cola se convierte temporalmente en una cola en serie y espera hasta que se complete alguna tarea previa en esa cola.async main queue
- para tocar la interfaz de usuario, el bloque no espera el resultado, sino que espera su ranura al comienzo. La cola principal es una cola en serie.Por supuesto, debe agregar alguna comprobación de errores a esto ...
fuente
guard
queself
no esnil
en la parte superior, por lo que ninguno de los código se ejecuta si se trata denil
, por ejemplo,guard strongSelf = self else { return }
..global(qos: .background)
para IO (solicitud de red). Uso.global(qos: .default)
o en su.global(qos: .utility)
lugar.Compilado en XCode 8, Swift 3 https://github.com/rpthomas/Jedisware
fuente
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 lee de un archivo XML (con almacenamiento en búfer) y realiza la interpolación de datos:
Nombre del dispositivo / .background / .utility / .default / .userInitiated / .userInteractive
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.
fuente
Hice esto y esto es especialmente importante si desea actualizar su IU para mostrar nuevos datos sin que el usuario se dé cuenta como en UITableView o UIPickerView.
fuente
// use Operation Queue si necesita llenar los objetos (etiquetas, vista de imagen, vista de texto) en su controlador de vista
fuente
Reformé su código en Xcode 8, Swift 3 y los cambios están marcados en contraste con su versión Swift 2.
fuente
Swift 3
desea llamar a un cierre en 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
método de sincronización
fuente
DispatchQueue.main.sync
Cola en serie:
Cola concurrente:
fuente
Para Swift 3
fuente
fuente
Actualización para swift 5
De la documentación de Apple :
Parámetros
etiqueta
Una etiqueta de cadena para adjuntar a la cola para identificarla de forma exclusiva en las 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.
fuente
ahora es simplemente:
el valor predeterminado es serial, para obtener concurrencia, utiliza el argumento de atributos opcionales .concurrent
fuente
seiralQueue.async {}
. @tylemolfuente
Puede crear la cola de despacho utilizando este código en swift 3.0
fuente