【问题标题】:Unable to get the Firebase to invoke the observe/observeSingleEvent callback无法让 Firebase 调用 observe/observeSingleEvent 回调
【发布时间】:2017-05-10 03:44:41
【问题描述】:

我想获取一个事件对应的用户

我有一个事件列表

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

我有一个用户列表

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

我的事件和用户模型如下

  • 事件
    • 事件 1
      • eventHost:user1_uid
    • 事件2
      • eventHost: user2_uid
  • 用户
    • 用户 1
      • 电子邮件: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"
  },

【问题讨论】:

  • 我想帮忙,但我没有看到任何明显错误的地方。我假设当你说回调永远不会被调用时,你在里面放了一个断点?
  • @JenPerson 是的,我放了一个断点,但它没有到达那里
  • 如果你在你的观察函数中打印一些东西,它会执行吗?
  • @J.Doe 不,它根本不会进入。我确实偶尔会看到它打印一次,但一直无法弄清楚如何让它始终如一地完成
  • 需要更多信息:if let userKey = code 是否被调用?如果您在 self._eventId 处设置断点并手动单步执行代码,一次一行,它会在哪一行停止工作?

标签: ios swift firebase firebase-realtime-database


【解决方案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)
})

【讨论】:

  • 是的,它设置为让未经身份验证的人读/写数据。我已经编辑了帖子以包含事件模型的相关/简化部分。完整代码贴here
  • 您的代码是正确的,您可以尝试添加keepSynced(true)并再次执行吗?
  • 我相信只有当你启用持久性时?无论哪种情况,添加它都无济于事
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-15
相关资源
最近更新 更多