gpt4 book ai didi

ios - Firebase - for 循环 Swift 中嵌套的 observeSingleEvent 方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:03:10 25 4
gpt4 key购买 nike

我一直在尝试使用实时数据库从 Firebase 获取数据。我想检查 iPhone 中的联系人,然后如果任何联系人号码与 db 中“数字”表中的任何号码匹配,那么我必须从中获取 user_key 然后使用该 key ,我必须获取相应的详细信息来自用户表。

for number in numbers {
Database.database().reference().child("numbers/\(number)").observeSingleEvent(of: .value, with: { (snapshot) in
if snapshot.exists() {
let userKey = snapshot.value as! String

// We found this user, no determine there name, (TODO has_image?)
Database.database().reference().child("users/\(userKey)/public/name").observeSingleEvent(of: .value, with: { (namesnapshot) in
if namesnapshot.exists() {
let name = namesnapshot.value as! String
print("FOUND \(name)")
complete(.success((userID: userKey, name: name)))
}
})

} else {
if numbers.index(of: number) == numbers.count - 1 { // Last Number checked and not found yet, so fail
complete(.failure(UserApiError.UserNotFound))
}
}
})
}

numbers 是特定联系人的联系号码数组。对于只有一个号码的联系人,这很好用。但是对于有多个号码的联系人,

Database.database().reference().child("users/\(userKey)/public/name").observeSingleEvent(of: .value, with: { (namesnapshot) in

将在一段时间后调用,因为 for 循环中的下一个索引被调用。因此,即使我在联系人的第一个数字中有数据,它也会返回失败,因为下一个数字将在 observeSingleEvent 成功之前迭代。

我已经坐了几个小时了,一点想法也没有。请帮忙!

最佳答案

我认为更好的方法是:
1 - 从数据库中获取所有数字。
2 - 获取数据库中存在的所有联系电话。
3 - 最后,获取该联系人的姓名。(完全按照您的方式)。
OBS:要做到这一点,你必须改变你的数据库。您的号码必须保存为键值对。例如“555-0000”:正确。

Database.database().reference().child("numbers").observeSingleEvent(of: .value, with: { (snapshot) in
guard let numbersFromDB = snapshot.value as? [String: Any] else{
print("Fail get numbers from db")
}
let numbersMatchedOnDB = numbersFromDB.keys.filter{ numbers.contains($0) }//get numbers from contact that exist on DB.
if numbersMatchedOnDB.isEmpty{
complete(.failure(UserApiError.UserNotFound))
}
else{
//For each contact number that exist on DB. it gets its name.
numbersMatchedOnDB.forEach{ numberMatchedOnDB in
Database.database().reference().child("numbers/\(numberMatchedOnDB)").observeSingleEvent(of: .value, with: { (snapshot) in
if snapshot.exists() {
let userKey = snapshot.value as! String
// .... nothing changed here ....
}
})
}
}
})

关于ios - Firebase - for 循环 Swift 中嵌套的 observeSingleEvent 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50134307/

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