无法让Firebase调用observe / observeSingleEvent回调

时间:2017-05-09 15:58:29

标签: ios swift firebase firebase-realtime-database

我希望获得与事件相对应的用户

我有一个事件列表

let eventsRef = FIRDatabase.database().reference.child("Events")

我有一个用户列表

let usersRef = FIRDatabase.database().reference.child("Users")

我的活动和用户模型如下

  • 活动
    • 事件1
      • eventHost:user1_uid
    • 事件2
      • eventHost:user2_uid
  • 用户
    • User1的
      • 电子邮件:email1
    • 用户2
      • 电子邮件:email2

永远不会调用以下回调(在事件模型中):

if let userKey = eventData["eventHost"] as? String {
  userRef = usersRef.child(userKey)
  userRef.observeSingleEvent(of: .value, with: { snapshot in
    ...           
  })
}

我可以确认我没有启用磁盘持久性,并且用户uid可用。我有什么明显错的吗?

====== 编辑:简化事件模型

import Foundation
import Firebase

class Event {

    // event metadata
    private var _eventId: String!
    private var _eventHost: User!

    var eventId: String {
        return _eventId
    }

    var eventHost: User {
        return _eventHost
    }

    init(eventId: String, eventData: Dictionary<String, Any>) {
        self._eventId = eventId

        if let userKey = eventData["eventHost"] as? String {
            let usersRef = FIRDatabase.database().reference().child("Users")
            let userRef = usersRef.child(userKey)
            print(userRef) 
            userRef.observeSingleEvent(of: .value, with: { (snapshot) in
                print("USERY: \(snapshot.key)")
                if let userDict = snapshot.value! as? Dictionary<String, Any> {
                    let id = snapshot.key
                    self._eventHost = User(userId: id, userData: userDict)
                }
            })
        }

    }
}

print(userRef)解析为

https://xxxx.firebaseio.com/Users/AFHpS3npOga4tfj10GS2HGeT9uJ3`

这是我的Firebase结构中的有效对象。 Firebase用户结构的片段

  "AFHpS3npOga4tfj10GS2HGeT9uJ3" : {
    "email" : "test@gmail.com",
    "firstName" : "Wilma",
    "lastName" : "Flintstone",
    "profileImageUrl" : "http://images.iimg.in/c/569f4771c45d324bda8b4660-4-501-0-1453279096/google/user-icon-png-pnglogocom.img",
    "provider" : "Firebase",
    "userId" : "AFHpS3npOga4tfj10GS2HGeT9uJ3"
  },

1 个答案:

答案 0 :(得分:1)

您可以查看firebase数据库的规则:

它应该是这样的

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null"
  }
}

为了让未经过身份验证的人员读/写数据,您应该执行以下操作:

{
  "rules": {
    ".read": true,
    ".write": true
  }
}

从你发布的代码我看不出任何问题...... 如果这不起作用,请发布更多代码并告诉我们您打算做什么,以便我们更好地为您提供帮助。

编辑:为了配合上述建议,在观察功能中添加取消阻止将显示是否存在规则问题。如果用户无法访问该节点,Xcode控制台将打印“Permission Denied”

userRef.observeSingleEvent(of: .value, with: { (snapshot) in
    print("USERY: \(snapshot.key)")
    if let userDict = snapshot.value! as? Dictionary<String, Any> {
        let id = snapshot.key
        self._eventHost = User(userId: id, userData: userDict)
    }
}, withCancel: { error in
    print(error.localizedDescription)
})