titletextattributes programar para desde descargar color bar apple ios multithreading concurrency swift multitasking

programar - ¿Cómo hacer multiprocesamiento, concurrencia o paralelismo en iOS Swift?



titletextattributes swift 4 (3)

¿Hay alguna manera de crear un hilo de trabajo en Swift ?, por ejemplo, si hay una funcionalidad importante que requiere muchos cálculos y, por lo tanto, hace que el hilo principal se demore unos segundos, si quisiera mover esa funcionalidad a un hilo separado o un hilo que no bloquea el hilo principal ¿hay alguna manera de hacerlo con Swift?

He revisado los componentes básicos y avanzados de la documentación de Apple para Swift, pero no hay nada acerca de la simultaneidad o el paralelismo, ¿alguien sabe algo sobre cómo hacerlo (si es posible)?


O puede usar colas de operación también. En Swift 3:

let queue = OperationQueue() queue.addOperation() { // do something in the background OperationQueue.main.addOperation() { // when done, update your UI and/or model on the main queue } }

O esto, o GCD, que Andy ilustró , funciona bien.

Consulte la Guía de programación de concurrencia de Apple para conocer los méritos relativos de las colas de operaciones y las colas de despacho (también conocidas como Grand Central Dispatch, GCD). Si bien esa guía todavía está ilustrando los ejemplos usando Objective-C, la API y los conceptos son básicamente los mismos en Swift (solo use la sintaxis de Swift). La documentación para GCD y colas de operaciones en Xcode describe las API de Objective-C y Swift.

Por cierto, notará que tanto en el ejemplo anterior como en la demostración de Andy GCD, usamos "cierres finales". Por ejemplo, si mira la definición addOperationWithBlock , se define como una función con un parámetro que es un "cierre" (que es análogo a un bloque en Objective-C):

func addOperation(_ block: @escaping () -> Swift.Void)

Eso podría llevarlo a suponer que lo invocaría de la siguiente manera:

queue.addOperation({ // do something in the background })

Pero cuando el último parámetro de una función es un cierre, la sintaxis de cierre final le permite sacar ese parámetro de cierre final de los paréntesis de la función, y moverlo después de la función, produciendo:

queue.addOperation() { // do something in the background }

Y como no queda nada entre paréntesis, puede ir un paso más allá y eliminar esos paréntesis vacíos:

queue.addOperation { // do something in the background }

Esperemos que ilustre cómo interpretar las NSOperationQueue la función NSOperationQueue / OperationQueue y / o GCD y NSOperationQueue en su código.


Puede usar Grand Central Dispatch (GCD) para tales tareas.

Este es un ejemplo básico:

let backgroundQueue: dispatch_queue_t = dispatch_queue_create("com.a.identifier", DISPATCH_QUEUE_CONCURRENT) // can be called as often as needed dispatch_async(backgroundQueue) { // do calculations } // release queue when you are done with all the work dispatch_release(backgroundQueue)


Esta biblioteca le permite describir la concurrencia de una manera súper expresiva:

func handleError(_ error) { ... } HoneyBee.start(on: DispatchQueue.main) { root in root.setErrorHandler(handleError) .chain(function1) // runs on main queue .setBlockPerformer(DispatchQueue.global()) .chain(function2) // runs on background queue .branch { stem in stem.chain(func3) // runs in parallel with func4 + stem.chain(func4) // runs in parallel with func3 } .chain(func5) // runs after func3 and func4 have finished .setBlockPerformer(DispatchQueue.main) .chain(updateUIFunc) }