Firebase 事件侦听器不起作用,我无法接收正确的快照

Posted

技术标签:

【中文标题】Firebase 事件侦听器不起作用,我无法接收正确的快照【英文标题】:Firebase Event listener doesn't work and I can't receive the right snapshot 【发布时间】: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)

         

【问题讨论】:

【参考方案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 及更高版本,因此对单例的需求减少了。 这只是一个像你解释的问题,一个树结构问题。谢谢大家的帮助。

以上是关于Firebase 事件侦听器不起作用,我无法接收正确的快照的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 连接检测在 60 秒后不起作用

在接收器应用程序中,为啥音频标签事件不起作用?

cleanup() 在使用 Firebase Firestore onSnapshot 的 useEffect() 中不起作用

按钮 onClick 事件侦听器在 Electron 应用程序中不起作用

当应用程序打开或应用程序处于后台时,Phonegap Firebase 推送通知不会触发事件侦听器

Firebase ValueEventListener根本没有触发