菜鸟教程小白 发表于 2022-12-11 20:06:58

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(&#34;numbers/\(number)&#34;).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(&#34;users/\(userKey)/public/name&#34;).observeSingleEvent(of: .value, with: { (namesnapshot) in
                if namesnapshot.exists() {
                  let name = namesnapshot.value as! String
                  print(&#34;FOUND \(name)&#34;)
                  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(&#34;users/\(userKey)/public/name&#34;).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(&#34;numbers&#34;).observeSingleEvent(of: .value, with: { (snapshot) in
      guard let numbersFromDB = snapshot.value as? else{
            print(&#34;Fail get numbers from db&#34;)
      }
      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(&#34;numbers/\(numberMatchedOnDB)&#34;).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]
查看完整版本: ios - Firebase - for loop Swift 内嵌套的 observeSingleEvent 方法