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)
}