所以我有一个函数来从给定的用户ID中检索用户信息:
func getUserDataFrom(_ userID: String, completion: @escaping (_ userData: DBUser) -> Void) {
ref.child(usersTable).child(userID).observeSingleEvent(of: .value) { (snapshot) in
if let userDic = snapshot.value as? NSDictionary {
let userData = DBUser(with: userDic)
completion(userData)
}
}
}
问题是,这会返回本地数据,而不是从Firebase读取。我想从服务器检索数据(只要有互联网连接),只有在没有可用的情况下才从磁盘读取。
我知道实现这一目标的最简单方法是使用一个监听器,但是我正在制作一个今天扩展,并且他们使用太多内存来增加崩溃的可能性。
我还研究了keepSynced
功能,但由于数据库对用户表的引用会有很多孩子,我不知道这是否会影响我的扩展内存。< / p>
长话短说:我想从Firebase读取一次数据,只有在没有最小内存使用量的互联网连接的情况下才能从磁盘读取。
提前谢谢。
答案 0 :(得分:0)
我检索了一些解释,我认为它可能对你有所帮助:
如果Firebase,带有keepSycned的ObserveSingleEventType 将无效 连接无法按时建立。这尤其如此 在appLaunch期间或appDelegate中有延迟 而是给出Firebase连接和缓存结果。它会 如果启用持久性并且有时也不起作用 observeSingleEvent可能首先提供缓存的数据。 在情况中 像这样,连续的ObserveEventType是首选,应该是 如果您绝对需要新数据,请使用
我认为你没有选择使用连续的倾听者。但是为了避免出现性能问题,为什么当你不再使用它时,你不能将自己移除给自己。
答案 1 :(得分:0)
在我创建并添加了代码的新项目中,它会在有连接时从Firebase检索数据,何时不从本地存储中检索。因此,我们得出结论,上面的代码正确地从他们的服务器获取Firebase数据。
然而,根据我的经验,observeSingleEvent和离线持久性有点间断(可能是一个&#39;功能&#39;?)。要解决此问题,请强制参考的数据保持同步
let usersTableRef = Database.database().reference(withPath: usersTable)
let thisUsersTableRef = usersTableRef.child(userId)
thisUsersTableRef.keepSynced(true)
//optional: thisUsersTableRef.child("temp").setValue(true)
thisUsersTableRef.observeSingleEvent(of: .value)
有关更多信息和更多示例,请参阅Offline Capabilities。
另请参阅2015年的this post,了解有关观察员/听众的一些见解。