swift - Firebase 引用对象不会保存到 SwiftUI 中的变量
问题描述
我将数据存储在 Firebase 中,并且找到了一种方法来创建仅包含键的数组。第一个打印语句正确打印出数组。但是,在数据库引用之外,该变量listOfBannedNames
似乎没有保存数组。该数组打印为 [] ,其中没有任何键。我想将数组存储在变量 listOfBannedNames 中以供以后使用。
let username = username
let formattedUsername = formatUsername(username: username)
var listOfBannedNames = [String]()
ref.observeSingleEvent(of: .value, with: {
snapshot in
var bannedNamesList = [String]()
for bannedNames in snapshot.children {
bannedNamesList.append((bannedNames as AnyObject).key)
}
listOfBannedNames = bannedNamesList
print(listOfBannedNames)
})
print(listOfBannedNames)
解决方案
这正是关于异步行为的。尝试进行以下操作:
func makeRequestToFirebase(completion: @escaping ([String]) -> Void) {
ref.observeSingleEvent(of: .value, with: {
snapshot in
var bannedNamesList = [String]()
for bannedNames in snapshot.children {
bannedNamesList.append((bannedNames as AnyObject).key)
}
listOfBannedNames = bannedNamesList
print(listOfBannedNames)
completion(listOfBannedNames) // - that will wait until the list of names arrives
})
}
然后使用函数:
makeRequestToFirebase() { names in
print(names)
workWithNames(names)
}
现在您可以随心所欲地使用它,例如:
func workWithNames(names: [String]) {
for name in names {
if name == "Alexander" {
print("One more Alexander found")
}
}
另请了解更多关于在 Swift 中转义闭包的信息。
推荐阅读
- javascript - BIRT 在脚本中将 HTML 文本转换为纯文本
- lightbox2 - Lightbox2 数据 uri 在 Edge/IE 上被截断
- python - 带有时区的 Pandas 日期时间到时间戳
- bash - 提取bash中特殊字符之间的文本
- sql - CTE 中的错误:无法绑定多部分标识符
- postgresql - 在 Windows Server 2016 服务器上安装时如何设置 postgresql 复制
- jquery - 引导带有边框和填充的圆形类元素
- java - 在 JMS/MQ 升级大写和小写问题后,使用 JMSCorrelationID 接收消息不起作用
- r - 重新排序 HeatMap.2 的行
- c# - 在多个 ObservableCollection 周围移动对象