ios swift firebase closures firebase-realtime-database

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