arrays - 如何正确地将数据附加到数组?斯威夫特4
问题描述
我一直在尝试从 firebase 检索一些数据并将其存储在数组中。但是当我尝试附加数据时遇到了问题。
我只能在闭包内和闭包外将数据存储到数组中,我突然丢失了数组内的所有值。为什么会这样?请帮助我找到我所缺少的...
var names = [String]()
var txts = [String]()
var imgUrls = [String]()
Database.database().reference().child("Posts").child("dummy").observe(.value) { (snapshot) in
guard let snapshots = snapshot.children.allObjects as? [DataSnapshot] else {
return
}
for snap in snapshots {
let autoId = snap.key as String
Database.database().reference().child("Posts").child("dummy").child(autoId).observe(.value, with: { (snapshot) in
guard let data = snapshot.value as? [String: Any] else {return}
//name
guard let name = data["name"] as? String else {return}
self.names.append(name)
//image
guard let imgUrl = data["image"] as? String else {return}
self.imgUrls.append(imgUrl)
//txt
guard let txt = data["text"] as? String else {return}
self.txts.append(txt)
print(self.names) //this returns all data from firebase
print(self.imgUrls) //this returns all data from firebase
print(self.txts) //this returns all data from firebase
}
print(self.names) //this returns empty array
print(self.imgUrls) //this returns empty array
print(self.txts) //this returns empty array
}
解决方案
可能是因为您在闭包内分配数据,这可能会在以后发生。所以基本上最后一个打印语句发生在闭包语句之前。
我会推荐你使用 didSet 来理解序列。例如:
var names: [String] = [String]() {
didSet {
print(names) // this is print each time the value is set
}
}
var txts: [String] = [String]() {
didSet {
print(txts)
}
}
var imgUrls: [String] = [String]() {
didSet {
print(imgUrls)
}
}
Database.database().reference().child("Posts").child("dummy").observe(.value) { (snapshot) in
guard let snapshots = snapshot.children.allObjects as? [DataSnapshot] else { return }
for snap in snapshots {
let autoId = snap.key as String
Database.database().reference().child("Posts").child("dummy").child(autoId).observe(.value, with: { (snapshot) in
guard let data = snapshot.value as? [String: Any] else {return}
//name
guard let name = data["name"] as? String else {return}
self.names.append(name)
//image
guard let imgUrl = data["image"] as? String else {return}
self.imgUrls.append(imgUrl)
//txt
guard let txt = data["text"] as? String else {return}
self.txts.append(txt)
}
}
推荐阅读
- flutter - 试图停止计时器但计时器没有停止
- php - 运行 PHPUnit 测试时无法加载 Xdebug
- android - 当我使用 viewmodel 时,为什么 onClick 方法不调用 ratingBar?
- python - 将数组字符串值添加到 pandas.DataFrame 时,它们会转换为浮点数
- telegram - 如何使用 python-telegram-bot (Bot API 5.1) 跟踪用户何时踢出 Telegram Bot
- maven - 就在创建新的 Maven 项目时,我收到此错误“无法计算构建计划插件 org.apache.maven.plugins maven-resources-plugin:2.6”
- javascript - 数据表中只显示一个数据
- python - 在python中重命名具有相似名称的多列
- javascript - 如果在定义的数组中找不到 JSON 属性,则删除
- sql-server - 如何将 RadioButton 的内容插入 UWP C# 的 SQL Server?