ios - Firebase - for loop Swift 内嵌套的 observeSingleEvent 方法
<p><p>我一直在尝试使用实时数据库从 Firebase 获取数据。我想检查 iPhone 中的联系人,然后如果任何联系人号码与 db 中“数字”表中的任何号码匹配,那么我必须从中获取 user_key,然后使用该 key ,我必须获取相应的详细信息来自用户表。</p>
<pre><code>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))
}
}
})
}
</code></pre>
<p>numbers 是特定联系人的联系人号码数组。对于具有单个号码的联系人,这可以正常工作。但是对于有多个号码的联系人,</p>
<pre><code>Database.database().reference().child("users/\(userKey)/public/name").observeSingleEvent(of: .value, with: { (namesnapshot) in
</code></pre>
<p>将在一段时间后调用,因为 for 循环中的下一个索引被调用。所以即使我在一个联系人的第一个号码中有数据,它也会返回失败,因为下一个号码将在observeSingleEvent成功之前被迭代。</p>
<p>我已经坐了几个小时了,没有留下任何想法。请帮忙!</p></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p>我认为更好的方法是:<br/>
1 - 从数据库中获取所有数字。<br/>
2 - 获取数据库中存在的所有联系电话。<br/>
3 - 最后,获取联系人的姓名。(完全按照您的方式)。<br/>
OBS:为此,您必须更改数据库。您的数字必须保存为键值对。例如“555-0000”:是的。</p>
<pre><code>Database.database().reference().child("numbers").observeSingleEvent(of: .value, with: { (snapshot) in
guard let numbersFromDB = snapshot.value as? 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 ....
}
})
}
}
})
</code></pre></p>
<p style="font-size: 20px;">关于ios - Firebase - for loop Swift 内嵌套的 observeSingleEvent 方法,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/50134307/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/50134307/
</a>
</p>
页:
[1]