gpt4 book ai didi

ios - 从 Firebase 数据库读取数据时出现问题

转载 作者:行者123 更新时间:2023-11-28 15:31:19 25 4
gpt4 key购买 nike

好的,我正在从数据库中读取数据,当我打印各个变量时,它们会正确打印出来。但是,数据似乎拒绝附加到数组。有人知道为什么吗?我完全想不通。

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

最佳答案

数据正确添加到数组中,只是不是在您打印数组内容时。

如果你这样修改代码,你会看到:

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

你会看到它打印出这样的东西:

returning 0

added one, now have 1

added one, now have 2

等等

这可能不是您预期的输出。但它正在按预期工作。 Firebase 从其数据库中异步加载数据。它不会阻塞您的代码,而是让线程继续运行(以便用户可以继续使用该应用程序),并在新数据可用时回调您传递给 observe 的代码块。

这意味着当这段代码返回数组时它仍然是空的,但它稍后会在项目进入时添加它们。这意味着您不能以您尝试的方式从函数返回数据。

我发现最容易改变我对代码的思考方式。而不是“先获取数据,然后打印它”,我将其框定为“开始获取数据。当数据返回时,打印它”。

在上面的代码中,我通过将打印计数的代码移到 回调 block 中来做到这一点。除了这样做,您还可以创建自己的回调,在 Swift 中称为完成处理程序闭包。您可以在 this article 中找到示例, this article ,这个问题Callback function syntax in Swift或者当然在 Apple 的文档中。

关于ios - 从 Firebase 数据库读取数据时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44711443/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com