【问题标题】:How can I wait data from firebase?如何等待来自 firebase 的数据?
【发布时间】:2020-08-21 18:57:56
【问题描述】:

我需要等待来自 firebase 的数据,否则我的应用会因为 nil 值而崩溃。我对此进行了搜索并观看了一些视频并查看了其他问题,但实际上我看不到任何 firebase 示例。如何等待来自 firebase 的数据?如何使用调度或信号量,哪个更有效?

这是我的示例代码:

        let uid = (Auth.auth().currentUser?.uid)!
        let usrIndirimRef = Database.database().reference().child("users").child(uid).child("indirimSayisi")
        usrIndirimRef.observe(.value) { (snap) in
            let userIndir = snap.value as! Int
            self.userIndirimSayisi = userIndir
            
            let usrIndirimTipiRef = Database.database().reference().child("users").child(uid).child("indirimTipi")
             usrIndirimTipiRef.observe(.value) { (snapshot) in
                 
                if userIndir < 1 {
                    self.userIndirim = "0"
                    self.indirimKontrol = false 
             
                    self.tableView.reloadSections([1], with: .fade)
                    
                    
                }else{
                    self.userIndirim = snapshot.value! as! String
                    self.tableView.reloadSections([1], with: .fade)
                    
                    
                }
    
             }
        }
    
        
        toplamHesapTutari()

这里toplamHesapTutari()函数在数据userIndirim之前执行。它可以解决可能会执行该功能,但我无法确定这是正确的方法。

【问题讨论】:

    标签: swift firebase


    【解决方案1】:

    不要等待,永远不要等待,运行您需要在内部完成处理程序运行的代码

    let uid = (Auth.auth().currentUser?.uid)!
    let usrIndirimRef = Database.database().reference().child("users").child(uid).child("indirimSayisi")
    usrIndirimRef.observe(.value) { (snap) in
        let userIndir = snap.value as! Int
        self.userIndirimSayisi = userIndir
        
        let usrIndirimTipiRef = Database.database().reference().child("users").child(uid).child("indirimTipi")
         usrIndirimTipiRef.observe(.value) { (snapshot) in
             
            if userIndir < 1 {
                self.userIndirim = "0"
                self.indirimKontrol = false 
         
                self.tableView.reloadSections([1], with: .fade)
                
                
            }else{
                self.userIndirim = snapshot.value! as! String
                self.tableView.reloadSections([1], with: .fade)
                
                
            }
            self.toplamHesapTutari()
         }
    }
    

    【讨论】:

      【解决方案2】:

      我之前遇到过这个问题,我尝试了很多方法,但我的应用仍然崩溃。

      所以我通过将导致我的应用程序崩溃的代码放在稍后的函数中来解决这个问题,以便腾出一些时间来完全加载基本数据。建议您使用 try-catch 和 log 来观察错误并防止您的应用不断崩溃。

      try {
           if ((snapshot.child("photo").value as? String)==null) {
                 //if not load
           } else {
                 //if load
           }
      }catch(ex: Exception){}
      

      这里有一些参考: https://kotlinlang.org/docs/reference/exceptions.html

      【讨论】:

        猜你喜欢
        • 2022-08-23
        • 2023-03-24
        • 1970-01-01
        • 2019-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-04
        • 1970-01-01
        相关资源
        最近更新 更多