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

时间:2017-05-22 11:50:23

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

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

我的问题是我无法在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,我无法理解代码的错误。{{ 3}}   Image of the Database tree

 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 个答案:

答案 0 :(得分: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)
        })
    }
}

至少应该打印这个应该是

的UserRef
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)
       })
   }
}