所以我的根数据库中有两个子部分,users和userSelfies
我使用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必定是问题所在。但是,我只是无法弄清楚为什么它可以工作并快速更新数据库的一个部分,而不是另一部分。实际上,用户部分包含更多信息并且更大!那么如果有什么应该慢一点?有什么理由发生这种情况吗?
答案 0 :(得分:1)
唉。一天后,我发现了。非常感谢firebase文档解释这一点。 因为firebase会将监听本地缓存视为一种观察,所以一旦完成一次监听,尝试删除监听器将无法正常工作,因为它不会有第二次机会从实际云中读取。因此,只有在离开场景后才会移除侦听器,或者为其提供足够的时间来完全查询云。但是,如果缓存的数据与服务器数据相同,那么它将不会“观察”服务器数据,它只会对缓存的数据进行一次观察,因此只会有一个观察事件。 在这篇文章的帮助下,我设法找出了最后一点:What actually happens when persistence is enabled in Firebase?