好的我正在从数据库中读取数据,当我打印各个变量时,它们会正确打印出来。但是,似乎数据拒绝附加到数组。谁知道为什么?我根本无法解决这个问题。
let commuteBuilder = Commutes()
Database.database().reference().child("Users").child(user).child("Trips").observe(DataEventType.childAdded, with: { (snapshot) in
//print(snapshot)
if let dict = snapshot.value as? NSDictionary {
commuteBuilder.distance = dict["Distance"] as! Double
commuteBuilder.title = dict["TripName"] as! String
commuteBuilder.transportType = (dict["Transport"] as? String)!
}
commuteArray.append(commuteBuilder)
})
print("helper")
print(commuteArray.count)
return commuteArray
答案 0 :(得分:1)
数据 正确添加到数组中,而不是在您打印数组内容时。
如果你改变这样的代码,你可以看到:
let commuteBuilder = Commutes()
Database.database().reference().child("Users").child(user).child("Trips").observe(DataEventType.childAdded, with: { (snapshot) in
if let dict = snapshot.value as? NSDictionary {
commuteBuilder.distance = dict["Distance"] as! Double
commuteBuilder.title = dict["TripName"] as! String
commuteBuilder.transportType = (dict["Transport"] as? String)!
}
commuteArray.append(commuteBuilder)
print("added one, now have \(commuteArray.count)")
})
print("returning \(commuteArray.count)")
return commuteArray
你会看到它打印出这样的东西:
返回0
添加一个,现在有1个
添加一个,现在有2个
等
这可能不是您预期的输出。但它按预期工作。 Firebase异步加载其数据库中的数据。它不是阻止你的代码,而是让线程继续(这样用户可以继续使用应用程序),而是在新数据可用时回调你传递给observe
的代码块。
这意味着,当此代码返回数组时,它仍然为空,但稍后会在项目进入时添加项目。这意味着您无法以您尝试的方式返回函数中的数据。
我发现改变我对代码的思考方式最容易。而不是"首先获取数据,然后将其打印出来#34;,我将其框架为"开始获取数据。当数据返回时,打印它"。
在上面的代码中,我通过将打印计数的代码移动到回调块来完成此操作。您也可以创建自己的回调,而不是在Swift中创建自己的回调,称为完成处理程序或闭包。您可以在this article,this article,此问题Callback function syntax in Swift或Apple的文档中找到示例。