¿Cómo usar el enhebrado en Swift?
dispatchOnMainThread:^{
NSLog(@"Block Executed On %s", dispatch_queue_get_label(dispatch_get_current_queue()));
}];
ios
swift
multithreading
dispatch-queue
Anshul
fuente
fuente
]
antes del punto y coma en la última línea?DispatchQueue.global(qos: .background).async { print("Run on background thread") DispatchQueue.main.async { print("We finished that.") // only back on the main thread, may you access UI: label.text = "Done." } }
Respuestas:
Swift 3.0+
Mucho se ha modernizado en Swift 3.0. Ejecutar algo en el hilo de fondo se ve así:
Swift 1.2 a 2.3
Pre Swift 1.2 - Problema conocido
A partir de Swift 1.1, Apple no admitía la sintaxis anterior sin algunas modificaciones. Pasar en
QOS_CLASS_BACKGROUND
realidad no funcionó, en lugar de usarInt(QOS_CLASS_BACKGROUND.value)
.Para obtener más información, consulte la documentación de Apple
fuente
Async.background {}
La mejor práctica es definir una función reutilizable a la que se pueda acceder varias veces.
FUNCION REUTILIZABLE:
por ejemplo, en algún lugar como AppDelegate.swift como una función global.
Nota: en Swift 2.0, reemplace QOS_CLASS_USER_INITIATED.value arriba con QOS_CLASS_USER_INITIATED.rawValue en su lugar
USO:
A. Para ejecutar un proceso en segundo plano con un retraso de 3 segundos:
B. Para ejecutar un proceso en segundo plano, ejecute una finalización en primer plano:
C. Para retrasar 3 segundos: observe el uso del parámetro de finalización sin parámetro de fondo:
fuente
if(background != nil){ background!(); }
conbackground?()
una sintaxis un tanto swiftier?DispatchQueue.global(priority: Int(DispatchQoS.QoSClass.userInitiated.rawValue)).async {
pero esto arroja un error comocannot invoke initializer for type 'Int' with an argument list of type '(qos_class_t)'
. Aquí se encuentra una solución de trabajo (DispatchQueue.global(qos: DispatchQoS.QoSClass.userInitiated).async
).La respuesta de Dan Beaulieu en swift5 (también funciona desde swift 3.0.1).
Swift 5.0.1
Uso
fuente
background
cierre sea muy muy muy largo (~ = infinito). Este método está hecho para durar un tiempo finito: el tiempo que necesita ejecutar su trabajo en segundo plano. Por lo tanto,completion
se llamará al cierre tan pronto como haya pasado el tiempo de ejecución del trabajo en segundo plano + el retraso.Versión Swift 3
Swift 3 utiliza una nueva
DispatchQueue
clase para gestionar colas e hilos. Para ejecutar algo en el hilo de fondo usarías:O si quieres algo en dos líneas de código:
También puede obtener información detallada sobre GDC en Swift 3 en este tutorial .
fuente
Del tutorial de Jameson Quave
Swift 2
fuente
En Swift 4.2 y Xcode 10.1
Tenemos tres tipos de colas:
1. Cola principal: La cola principal es una cola en serie creada por el sistema y asociada con el hilo principal de la aplicación.
2. Cola global: la cola global es una cola concurrente que podemos solicitar con respecto a la prioridad de las tareas.
3. Colas personalizadas: pueden ser creadas por el usuario. Las colas concurrentes personalizadas siempre se asignan a una de las colas globales al especificar una propiedad de Calidad de servicio (QoS).
Todas estas colas se pueden ejecutar de dos maneras.
1. Ejecución síncrona
2. Ejecución asincrónica
Desde AppCoda: https://www.appcoda.com/grand-central-dispatch/
fuente
.background
QoS o,.userInitiated
pero para mí funcionó.background
Swift 4.x
Pon esto en algún archivo:
y luego llámalo donde lo necesites:
fuente
Debe separar los cambios que desea ejecutar en segundo plano de las actualizaciones que desea ejecutar en la interfaz de usuario:
fuente
dispatch_async(dispatch_get_main_queue()) { // update some UI }
se llama cuando la declaración de fondo (Bloque externo) termina de ejecutarse?Sin embargo, buenas respuestas, de todos modos, quiero compartir mi solución orientada a objetos actualizada para Swift 5 .
por favor échale un vistazo: AsyncTask
Conceptualmente inspirado en AsyncTask de Android, escribí mi propia clase en Swift
AsyncTask permite el uso correcto y fácil del hilo de la interfaz de usuario. Esta clase permite realizar operaciones en segundo plano y publicar resultados en el hilo de la interfaz de usuario.
Aquí hay algunos ejemplos de uso
Ejemplo 1 -
Ejemplo 2 -
Tiene 2 tipos genéricos:
BGParam
- el tipo de parámetro enviado a la tarea tras la ejecución.BGResult
- el tipo del resultado del cálculo de fondo.Cuando crea una AsyncTask, puede esos tipos a lo que necesite para pasar dentro y fuera de la tarea en segundo plano, pero si no los necesita, puede marcarlos como no utilizados simplemente configurándolos en:
Void
o con una sintaxis más corta:()
Cuando se ejecuta una tarea asincrónica, se realizan 3 pasos:
beforeTask:()->Void
invocado en el hilo de la interfaz de usuario justo antes de que se ejecute la tarea.backgroundTask: (param:BGParam)->BGResult
invocado en el hilo de fondo inmediatamente despuésafterTask:(param:BGResult)->Void
invocado en el hilo de la interfaz de usuario con el resultado de la tarea en segundo planofuente
Como la pregunta OP ya ha sido respondida anteriormente, solo quiero agregar algunas consideraciones de velocidad:
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
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
Swift 5
Para hacerlo más fácil, cree un archivo "DispatchQueue + Extensions.swift" con este contenido:
Uso:
fuente
Grand Central Dispatch se usa para manejar la multitarea en nuestras aplicaciones iOS.
Puedes usar este código
Más información utilice este enlace: https://www.programminghub.us/2018/07/integrate-dispatcher-in-swift.html
fuente
Función multipropósito para hilo
Úselo como:
fuente
Realmente me gusta la respuesta de Dan Beaulieu, pero no funciona con Swift 2.2 y creo que podemos evitar esos desagradables desenredos forzados.
fuente
fuente
en Swift 4.2 esto funciona.
fuente