En mi aplicación, tengo una función que hace una NSRURLSession y envía una NSURLRequest usando
sesh.dataTaskWithRequest(req, completionHandler: {(data, response, error)
En el bloque de finalización para esta tarea, necesito hacer algunos cálculos que agreguen un UIImage al controlador de vista de llamada. Tengo un func llamado
func displayQRCode(receiveAddr, withAmountInBTC:amountBTC)
eso hace el cálculo de agregar UIImage. Si intento ejecutar el código de adición de vista dentro del bloque de finalización, Xcode arroja un error que dice que no puedo usar el motor de diseño mientras estoy en un proceso en segundo plano. Entonces encontré un código en SO que intenta poner en cola un método en el hilo principal:
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(0.0 * Double(NSEC_PER_MSEC)))
dispatch_after(time, dispatch_get_main_queue(), {
let returned = UIApplication.sharedApplication().sendAction("displayQRCode:", to: self.delegate, from: self, forEvent: nil)
})
Sin embargo, no sé cómo agregar los parámetros "recibirAddr" y "cantidadBTC" a esta llamada de función. ¿Cómo haría esto, o alguien puede sugerir una forma óptima de agregar una llamada de método a la cola principal de la aplicación?
Versión Swift 3+ y Swift 4:
Swift 3 y Xcode 9.2:
fuente
Swift 2
El uso de cierres finales se convierte en:
Trailing Closures es un azúcar sintáctico Swift que permite definir el cierre fuera del alcance del parámetro de la función. Para obtener más información, consulte Cierres finales en la Guía del lenguaje de programación Swift 2.2.
En el caso de dispatch_async, la API es
func dispatch_async(queue: dispatch_queue_t, _ block: dispatch_block_t)
ya quedispatch_block_t
es un alias de tipo para() -> Void
: un cierre que recibe 0 parámetros y no tiene un valor de retorno, y el bloque es el último parámetro de la función de la que podemos definir el cierre en el ámbito externodispatch_async
.fuente
Recargar colecciónVer en hilo principal
fuente
Aquí está la sintaxis de estilo Swifty / Cocoa más agradable (IMO) para lograr el mismo resultado que las otras respuestas:
O puede tomar la popular biblioteca Async Swift para obtener aún menos código y más funcionalidad:
fuente
OperationQueue.main.addOperation({ }
La forma correcta de hacer esto es usar dispatch_async en main_queue, como hice en el siguiente código
fuente
Aquí hay una pequeña función global que puedes agregar para una sintaxis más agradable:
Y el uso
fuente
fuente
No olvide debilitarse si lo está usando dentro del cierre.
fuente