2016-12-01 81 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)是火力地堡暗示的方式,但我甚至不能得到用户保持外接近像我可以与结构。

+1

目前还不清楚你在问什么。 firebase数据在闭包内有效,所以例如你想填充一个tableView。你观察你想要的节点,然后数据在闭包内返回。你迭代快照并填充一个数组(在闭包之外定义),一旦完成,tableView.reload(仍在闭包内)。从那时起,你的数据被存储在数组中,并可以使用。您根本不需要执行DispatchQueue.main.async。 – Jay

回答

0

您在关闭中创建的对象将在关闭完成所需操作时释放。正如@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) 
})