2016-12-01 2 views
0

Когда я впервые задал этот вопрос, я действительно не сделал свое исследование. Но через 20 часов после этого у меня есть структура, точно такая же, как в документах Firebase. Но я не могу получить доступ к каким-либо данным за пределами закрытия. Вот структура, где данные должны быть записаны, чтобы:Доступ к данным за пределами закрытого пространства, Firebase ObserveSingleEvent // SWIFT

struct UserStruct { 
     let name : String! 
     let age : String! 
    } 

И когда она вызывается, все написано совершенен в базе данных, внутри закрытия он не печатает ноль, это печать фактическое значение очевидно. Я уже пробовал

DispatchQueue.main.async { 

    } 

Но это тоже не сработало, кто-нибудь меня направит! Любая помощь приветствуется, это мой последний вопрос с Firebase.

 let currentUser = FIRDatabase.database().reference(withPath: "users").child((FIRAuth.auth()!.currentUser?.uid)!) 
     currentUser.observeSingleEvent(of: .value, with: { snapshot in 
     let value = snapshot.value as? NSDictionary 
     let name = value?["name"] as? String 
     let age = value?["age"] as? String 
     self.userAdded.insert(UserStruct(name: name, age: age), at: 0) // 1 
     let user = UserStruct.init(name: name, age: age) // 2 

     print("1 \(user.name)") 
     print("2 \(self.userAdded[0].name!)") 
    }) 

Я написал два способа получения данных, номер два (2) путь Firebase предполагает, но я даже не могу ухватить пользователей за пределами ближе, как я могу с Struct.

+1

Непонятно, что вы просите. Данные firebase действительны в закрытии, поэтому, например, вы хотите заполнить таблицуView. Вы наблюдаете нужный вам узел, затем данные возвращаются внутри закрытия. Вы перебираете снимок и заполняете массив (который определен за пределами закрытия), и как только это будет сделано, tableView.reload (все еще внутри закрытия). С этого момента данные хранятся в массиве и с ними можно работать. Вам вообще не нужно делать DispatchQueue.main.async. – Jay

ответ

0

Ваш объект user, который вы создаете в закрытии, освобождается, когда закрытие заканчивает то, что он должен делать. Как сказал @Jay в комментарии, вам нужно сохранить данные, которые вы получаете в своем закрытии, в переменной за пределами вашего закрытия. Быстрый и грязный способ проверить это было бы создать переменную в классе вы находитесь, и назначить user вы создаете в своем закрытии этой переменной и распечатать его, чтобы увидеть, если он работал:

//add a property in your class to store the user you get from Firebase 
var retrievedUser: UserStruct? 

let currentUser = FIRDatabase.database().reference(withPath: "users").child((FIRAuth.auth()!.currentUser?.uid)!) 
currentUser.observeSingleEvent(of: .value, with: { snapshot in 
    let value = snapshot.value as? NSDictionary 
    let name = value?["name"] as? String 
    let age = value?["age"] as? String 

    let user = UserStruct.init(name: name, age: age) 

    //assign the user retrieved from Firebase to the property above 
    self.retrievedUser = user 
    //print the local copy of the retrived user to test that it worked 
    print(retrievedUser) 
}) 
Смежные вопросы