使用observeSingleEvent更新Firebase本地数据

时间:2017-11-15 15:41:04

标签: ios swift firebase firebase-realtime-database

所以我有一个函数来从给定的用户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读取一次数据,只有在没有最小内存使用量的互联网连接的情况下才能从磁盘读取。

提前谢谢。

2 个答案:

答案 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,了解有关观察员/听众的一些见解。