【问题标题】:Firebase Event listener doesn't work and I can't receive the right snapshotFirebase 事件侦听器不起作用,我无法接收正确的快照
【发布时间】:2017-05-22 11:50:22
【问题描述】:

我是新来的,如果我没有设法创造一个好的,请原谅我
和格式良好的问题。

我的问题是我无法在Firebase 中获取特定孩子的快照。

我需要放置一个事件监听器,当数据库发生变化时,它将返回值(用户的令牌):

notifications.child("tokens").child("id_user_token").child(user)

我还发布了数据库树的图像,以便您查看其中的内容。 我的目的是保存从数据库中检索到的令牌并创建一个HashMap(用于构建通知),其中将包含令牌、标题和消息。从代码中可以看出,我使用init() 函数传递了所有参数。我尝试在ViewController.swift 中调用此函数,如下所示: "FirebaseMessagingService.init(user: "2", title: "Test",message: "Test")"

正如您从数据库图像中看到的那样,有id = 2 的用户,但是当我尝试打印快照时,它会打印null,我无法理解代码有什么问题。Image of the Database tree Here is the exported JSON

 import Foundation
 import FirebaseMessaging
 import FirebaseDatabase

 class FirebaseMessagingService{


   var mDatabase : DatabaseReference
   var notifications = DatabaseReference()



      init(user: String,title: String, message:String){

          self.mDatabase = Database.database().reference()
          self.notifications = Database.database().reference()

          notifications = mDatabase.child("notificationRequests")
          var notification = NSMapTable<AnyObject, AnyObject>()

               notifications.child("tokens").child("id_user_token").child(user).observeSingleEven  t(of: .value, with: { snapshot in


                     var token = Messaging.messaging().fcmToken! as String
                     print("\n\n\n\n\(snapshot)")

                     token = (snapshot.value as? String)!

                     notification.setValue(token, forKey: "toUser")
                     notification.setValue(title, forKey: "title")
                     notification.setValue(message, forKey: "message")


                  }){ (error) in

                     print("\n\n\n\n")
                     print(error.localizedDescription)

         }

【问题讨论】:

    标签: ios firebase swift3 notifications firebase-realtime-database


    【解决方案1】:

    尝试如下更改您的代码

    import FirebaseDatabase
    
    class FirebaseMessagingService{
    
        var ref: DatabaseReference!
    
        init(user: String, title: String, message: String) {
            self.ref = Database.database().reference()
    
            let notifRef = self.ref.child("notificationRequests")
            let thisUserRef = notifRef.child("tokens").child("id_user_token").child(user)
            print(thisUserRef)
            thisUserRef.observeSingleEvent(of: .value, with: { snapshot in
                print(snapshot)
            })
        }
    }
    

    至少应该打印 thisUserRef 应该是

    yourDataBase/notificationRequests/tokens/id_user_token/2
    

    它还应该打印快照

    snap( 2: cq3Xy...... )
    

    让我们知道打印的内容以及打印时路径是否正确。

    另外,在你的问题中,你说你的目标是

    我需要放置一个事件监听器,它将返回值( 用户的令牌)当数据库发生变化时:

    您提供的代码不会那样做。你正在使用

    .observeSingleEvent
    

    它就是这样做的——观察一个事件,一次。它不会在节点上为将来的事件留下监听器。

    如果你想观察所有事件然后使用

       .observe(.value... (or .childAdded etc)
    

    但是,我认为您的意思并不是要观察该特定节点的更改(或者您可能确实这样做了)。您可能的意思是,当其他地方的数据库发生更改时,您将需要获取该用户的 uid,这是您问题中的代码正在尝试执行的操作。

    最后一件事:

    你真的不应该把它定义为一个类。它应该是一个在你的 viewController 中被调用的函数

    class ViewController: UIViewController {
    
       var ref: DatabaseReference!
    
       override func viewDidLoad() {
            super.viewDidLoad()
            ref = Database.database().reference()
            self.showUid(user: "2", title: "some title", message: "some message")
       }
    
       func showUid( user: String, title: String, message: String) {
           let notifRef = self.ref.child("notificationRequests")
           let thisUserRef = notifRef.child("tokens").child("id_user_token").child(user)
           print(thisUserRef)
           thisUserRef.observeSingleEvent(of: .value, with: { snapshot in
               print(snapshot)
           })
       }
    }
    

    【讨论】:

    • 感谢您的回答。我更新了代码,但仍然得到“Snap (2)
    • 实现一个像我这样的类有什么问题以及在 ViewController 中实现它的好处是什么?
    • @MelaDeveloper 如果您得到空值,那么您需要查看您的路径以及 Firebase 的初始化方式 - 这可能不正确。我复制了你的结构并在一个全新的项目中使用了代码,它工作正常。
    • @MelaDeveloper 通常,类需要被实例化,并且当包含它们的函数结束时可能会超出范围。当我需要处理一系列类似的对象时,我喜欢使用它们——用户类是对类对象的一种很好的使用。对于这个用例,您的 viewController 中的一个简单函数可以满足您的需要,如我的回答中所示。与类相比,您的代码更适合单例模式,但由于我们已经迁移到 Swift 3 及更高版本,因此对单例的需求减少了。
    • 这只是一个像你解释的问题,一个树结构问题。谢谢大家的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    • 1970-01-01
    相关资源
    最近更新 更多