dispatchqueue dispatch_async async grand-central-dispatch swift

grand-central-dispatch - dispatch_async - nsoperation swift



Usando dispatch_async con uno mismo (2)

Debe condicionar la desactivación de esta acción en la no nulidad, no realizar una prueba después de haberla iniciado:

if let hostView = self.hostViewController?.view { DispatchQueue.main.async { hostView.addSubview(self.commandField) } } else { // handle nil hostView }

Nunca debe desenvolver un opcional fuera de un if let , o probarlo primero. Hacer esto también debería resolver tu débil auto problema.

Me he encontrado con este problema varias veces al portar el código Objective-C a Swift. Digamos que tengo el siguiente código:

dispatch_async(dispatch_get_main_queue()) { self.hostViewController?.view.addSubview(self.commandField) }

Esto dará como resultado un error, subrayando la llamada dispatch_async completa, ofreciendo:

Could not find member ''addSubview''

Supongo que este es un error que aún no se ha implementado correctamente porque si pongo la llamada addSubview fuera del bloque dispatch_async , el proyecto se desarrolla bien. Inicialmente asumí que podría tener algo que ver con capturarse a self en el bloque. Sin embargo, al insertar [unowned self] in resultado, se produce el mismo error, al igual que en [weak self] in (después de que se hayan insertado los operadores de desenvolvimiento apropiados).

¿Cómo puedo hacer que los bloques dispatch_async funcionen en Swift que necesitan capturarse a self ?


La sintaxis de dispatch_async ha cambiado con Swift 3:

DispatchQueue.main.async { hostView.addSubview(self.commandField) }