ios - obtener datos de un cierre que recupera datos de firebase
swift closures (1)
Estoy tratando de recuperar datos de Firebase y almacenarlos fuera del cierre que los recupera.
var stringNames = [String] ()
ref?.observeEventType(.Value, withBlock: { snapshot in
var newNames: [String] = []
for item in snapshot.children {
if let item = item as? FIRDataSnapshot {
let postDict = item.value as! [String: String]
newNames.append(postDict["name"]!)
}
}
stringNames = newNames
})
print(stringNames)
stringNames vuelve vacío, pero cuando imprimo desde el interior del cierre tiene los datos correctos. Cualquier ayuda sería muy apreciada, ¡gracias!
Esto se debe a que cuando obtiene datos de Firebase, la llamada es asíncrona. Lo que puedes hacer:
Opción 1: establezca su lógica dentro del cierre (como lo que tiene que imprime la var dentro del cierre).
Opción 2: defina su propio cierre para recibir sus datos como:
func myMethod(success:([String])->Void){
ref?.observeEventType(.Value, withBlock: { snapshot in
var newNames: [String] = []
for item in snapshot.children {
if let item = item as? FIRDataSnapshot {
let postDict = item.value as! [String: String]
newNames.append(postDict["name"]!)
}
}
success(newNames)
})
}
Opción 3: usar el patrón de delegado
protocol MyDelegate{
func didFetchData(data:[String])
}
class MyController : UIViewController, MyDelegate{
func myMethod(success:([String])->Void){
ref?.observeEventType(.Value, withBlock: { snapshot in
var newNames: [String] = []
for item in snapshot.children {
if let item = item as? FIRDataSnapshot {
let postDict = item.value as! [String: String]
newNames.append(postDict["name"]!)
}
}
self.didFetchData(newNames)
})
}
func didFetchData(data:[String]){
//Do what you want
}
}