Firebase从一个数据库返回数据,但不从另一个数据库返回数据

时间:2017-09-19 17:25:16

标签: swift firebase firebase-realtime-database

所以我的根数据库中有两个子部分,users和userSelfies enter image description here

enter image description here

我使用users部分存储个人资料图片的id,以及userSelfies部分来存储实际的下载链接。 我创建了一个通用函数来从数据库中的任何路径检索数据。它看起来像这样:

static func getDatabaseEntry(path: String, key: String, completionHandler: @escaping (_ return: AnyObject?, _ error: String?) -> Void) {

    databaseReference.child(path).observeSingleEvent(of: .value, with: { (snapshot) in
        //print("snapshot: ", snapshot)


        dump((snapshot.value as? [String: AnyObject]))

        if let value =  (snapshot.value as? [String: AnyObject])?[key] {
            print("unwrapped snapshot dict value from key: ", value)

            completionHandler(value,  nil)

        }else{
            print("no value for key \(key) so setting return as nil")
            completionHandler(nil,  nil)

        }

    }) { (error) in
        print(error.localizedDescription)
        completionHandler(nil,  error.localizedDescription)


    }


}

现在出于一些奇怪的原因,在'用户'上使用此功能时数据库的一部分,它按预期返回,延迟几毫秒。但是,当使用这个完全相同的函数和不同的路径参数导致userSelfies下载链接时,该函数返回nil。我在快照上尝试了dump(),我手动尝试找到自拍ID键。它返回了最新(或任何最近)条目的所有数据库条目的字典除外。然后我检查了网站,以确保数据实际存在于数据库中,重新加载页面,确定它就在那里。

这意味着Firebase SDK observeSingleEvent必定是问题所在。但是,我只是无法弄清楚为什么它可以工作并快速更新数据库的一个部分,而不是另一部分。实际上,用户部分包含更多信息并且更大!那么如果有什么应该慢一点?有什么理由发生这种情况吗?

1 个答案:

答案 0 :(得分:1)

唉。一天后,我发现了。非常感谢firebase文档解释这一点。 因为firebase会将监听本地缓存视为一种观察,所以一旦完成一次监听,尝试删除监听器将无法正常工作,因为它不会有第二次机会从实际云中读取。因此,只有在离开场景后才会移除侦听器,或者为其提供足够的时间来完全查询云。但是,如果缓存的数据与服务器数据相同,那么它将不会“观察”服务器数据,它只会对缓存的数据进行一次观察,因此只会有一个观察事件。 在这篇文章的帮助下,我设法找出了最后一点:What actually happens when persistence is enabled in Firebase?