Firebase两个观察员之一无法正常工作 [英] Firebase one of two observers not working

查看:29
本文介绍了Firebase两个观察员之一无法正常工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个观察者,第二个观察者取决于第一个观察者的值.我似乎无法让第一个观察者工作,我在Xcode上没有任何错误.第一个功能必须检查用户"概要文件中的信息,然后使用该信息在数据库中搜索不同的信息.这是我的代码:

I have two observers, the second observer is dependent on the first observers value. I can't seem to get the first observer to work, I am not getting any errors on Xcode. The first function has to check the Users profile for information and then use that information to search for different information in the database. Here is my code:

func loadposts() {
    ref = Database.database().reference()
    let trace = Performance.startTrace(name: "test trace")
    trace?.incrementCounter(named:"retry")
    let userID = Auth.auth().currentUser?.uid
    print(userID!)


   ref.child("Users").child(userID!).observeSingleEvent(of: .value, with: { (snapshot) in
        // Get user value
        let value = snapshot.value as? NSDictionary
        let one1 = value?["Coupon Book"] as? String ?? ""
        print("one1: \(one1)")
        self.bogus.set(one1, forKey: "bogus")
    }) { (error) in
        print(error.localizedDescription)
    }

    delay(0.1) {
    print("bogus: \(self.bogus.string(forKey: "bogus"))")
    Database.database().reference().child("Coupons").child(self.bogus.string(forKey: "bogus")!).observe(.childAdded) { (Snapshot : DataSnapshot) in
        if let dict = Snapshot.value as? [String: Any] {
            let captiontext = dict["company name"] as! String
            let offerx = dict["offer count"] as! String
            let logocomp = dict["logo"] as! String
            let actchild = dict["childx"] as! String
            let post = Post(captiontext: captiontext, PhotUrlString: actchild, offertext: offerx, actualphoto: logocomp)
            self.posts.append(post)
            self.tableview.reloadData()

            print(self.posts)
        }
    }
    }
    trace?.stop()
}

感谢您的帮助.

推荐答案

self.bogus.string(forKey:"bogus"))"为零,因为 observeSingleEvent async 方法,因此要获得所需的结果,您需要在第一个观察者中调用第二个观察者,或者可以使用完成处理程序

self.bogus.string(forKey: "bogus"))" is nil because observeSingleEvent is an async method, so to get the required results you need to call the second observer inside the first observer or you can use the completion handler

您可以像这样使用completionHandler:

You can use the completionHandler like this:

guard let uid = Auth.auth().currentUser?.uid else {
    return
  }

    func firstObserverMethod(completionCallback: @escaping () -> Void) {

                ref.child("Users").child(uid).observeSingleEvent(of: .value, with: { (snapshot) in
                    // Get user value
                    if let value = snapshot.value as? [String: Any] {
                          let one1 = value["Coupon Book"] as? String

                          print("one1: \(one1)")
                          self.bogus.set(one1, forKey: "bogus")
                          completionCallback()

                    }




                }) { (error) in
                    print(error.localizedDescription)
                }
            }

现在使用上述方法:

    firstObserverMethod {

                     print("bogus: \(self.bogus.string(forKey: "bogus"))")
                     guard let bogusString = self.bogus.string(forKey: "bogus") else {                
                            print("bogus is not set properly")
                            return
                     } 


 Database.database().reference().child("Coupons").child(bogusString).observe(.childAdded) { (Snapshot : DataSnapshot) in
                        if let dict = Snapshot.value as? [String: Any] {
                            let captiontext = dict["company name"] ?? ""
                            let offerx = dict["offer count"] ?? ""
                            let logocomp = dict["logo"] ?? ""
                            let actchild = dict["childx"] ?? ""
                            let post = Post(captiontext: captiontext, PhotUrlString: actchild, offertext: offerx, actualphoto: logocomp)
                            self.posts.append(post)
                            DispatchQueue.main.async {
                                   self.tableview.reloadData()
                            }


                            print(self.posts)
                        }
                    }

                }

注意:您应该使用可选绑定从可选项获取值

Note: You should use optional binding to get the values from optional

这篇关于Firebase两个观察员之一无法正常工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆