我正在尝试将Firebase用于部分离线应用,它似乎具有我需要的所有离线功能但我在离线时获取数据时遇到问题。我想要存储的JSON结构是对用户配置文件的单个引用:
{
"Profiles" : {
"pOnv3q1PxqPyqKH0uqtDYaXqvqF2" : {
"firstName" : "John",
"lastName" : "Doe"
}
}
}
我已将Database.database().isPersistenceEnabled = true
和keepSynced(true)
设置为我希望保持脱机缓存的引用。我在第一次创建引用时以及在后续启动时加载它时都设置了keepSynced(true)
。
如果我在线启动应用程序,则会创建引用并将其保存到在线数据库中。如果我仍然在线关闭应用程序并完全杀死它,然后重新启动,则可以按照您的预期找到引用。
我离线启动应用程序,离线创建引用并将其保存到缓存中。我完全杀死了应用程序并重新启动它然后重新连接,引用将按照您的预期从缓存中推送到在线数据库。
我在线启动应用程序,创建引用并在仍然在线时退出。我杀了应用程序,然后离线重新启动它,却发现引用没有存储在缓存中而且没有被加载。
在我看来,这些场景就像成功缓存了对在线数据库的请求,但数据库本身并没有。
我是否误解了Firebase离线功能或者这应该有效吗?值得注意的是,这是在 Xcode9,iOS11和Swift 4 中,因此可能存在兼容性问题。
我用来获取此引用的代码是:
Database.database().child("Profiles").child(userId).observeSingleEvent(of: .value) { snapshot in
print(snapshot)
}
在失败的提取中,这将返回一个空快照。我的印象是,如果本地缓存不知道密钥的存在,那么将不会调用完成处理程序,但是它被调用导致我认为密钥存在但数据未被提取正常。
理想情况下,用户可以离线注册并具有基本功能,然后在建立连接时推送数据,但目前配置文件只能加载可用的连接。
真的很感激任何帮助。