Seu*_*ije 0 asynchronous ios firebase swift google-cloud-firestore
我正在使用 Swift 5、SwiftUI 和 Firebase 进行一个简单的项目,该项目循环遍历数组中的给定 id,在 Cloud Firestore 数据库中搜索每个 id,并将与该 id 关联的相应名称附加到新数组中。
例如,我得到一个数组的几个 id,然后对于给定数组中的每个元素,我获取与该 id 关联的文档,然后打印该文档中的“firstname”字段。
但是,我想将检索到的每个“名字”值存储到本地的单独数组中以备后用。在 Javascript 中,我知道这是使用 await 和 async 函数完成的,但是我在无数小时的故障排除中发现 Swift 没有 async 或 await。
这是我的代码:
func convertToNames(arr: [String]) -> [String]{
var newArr : [String] = []
for id in arr {
let docRef = db.collection("users").document(id)
docRef.getDocument { (document, error) in
if let document = document, document.exists {
let dataDescription = document.data().map(String.init(describing:)) ?? "nil"
let data = document.get("firstname") ?? "nil"
print("gotten data: \(data)")
newArr.append(String(describing: data))
} else {
print("Document does not exist")
}
}
}
print("NEW ARRAY: \(newArr)")
return (newArr)
}
Run Code Online (Sandbox Code Playgroud)
这段代码在完成时打印一个空数组,我明白为什么,但我不知道如何让它在 Swift 中工作。我今天花了大约 5 个小时来筛选 Firebase 文档、查看示例代码并筛选 Youtube,但是没有任何资源能够在我需要的范围内解决这个问题。如果无法做到,请告诉我。
除了完成,您还需要一个调度组
func convertToNames(arr: [String],completion:@escaping(([String]) -> ())) {
var newArr : [String] = []
let g = DispatchGroup()
for id in arr {
let docRef = db.collection("users").document(id)
g.enter()
docRef.getDocument { (document, error) in
if let document = document, document.exists {
let dataDescription = document.data().map(String.init(describing:)) ?? "nil"
let data = document.get("firstname") ?? "nil"
print("gotten data: \(data)")
newArr.append(String(describing: data))
g.leave()
} else {
print("Document does not exist")
g.leave()
}
}
}
g.notify(queue:.main) {
print("NEW ARRAY: \(newArr)")
completion(newArr)
}
}
Run Code Online (Sandbox Code Playgroud)
称呼
convertToNames(arr:<#arr#>) { res in
print(res)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
958 次 |
| 最近记录: |