observeSingleEvent(of:with :)获取旧数据

时间:2017-03-31 16:15:17

标签: ios swift firebase firebase-realtime-database

背景:

我有一个应用程序,新用户填写注册表单(包括用户名,电子邮件和密码)以注册帐户。当新用户提交表单时,应用会检查其Firebase数据库以查看是否已使用该用户名。这里的问题是observeSingleEvent(of:with:)没有得到最新的数据。当我直接从Firebase控制台更新数据时,更改不会反映在observeSingleEvent(of:with:)的返回结果中。即使在应用程序重新启动之间,也不会返回新的数据更改。

我在这个问题上唯一看到的是here。用户说使用observeSingleEvent(of:with:)时没有启用持久性。但是,我有持久性禁用。另外,我将keepSynced()实例上的FIRDatabase设置为false(我也尝试过了)。两种设置都没有运气。

这是我正在尝试的一个例子:

let usersDatabaseReference = FIRDatabase.database().reference().child("users")
usersDatabaseReference.keepSynced(false)

// Query the database to see if the username is available 
// The user with the username "mark" was removed from the database via the Firebase console
let username = "mark" // This user used to exist in the database (and was previously added through the app).  
usersDatabaseReference.child(username).observeSingleEvent(of: .value, with: { (snapshot) in ... } )

上面的代码块应该返回最新的数据(用户"标记"不应该存在的数据)。

我想知道是否有其他人遇到过这个问题,或者是否有人有可能的解决方案。

注意:使用iOS 10.1和swift 3进行开发。

3 个答案:

答案 0 :(得分:1)

observeSingleEvent(of:with:)只返回一次值

试试这个:

refHandle = postRef.observe(FIRDataEventType.value, with: { (snapshot) in
  let postDict = snapshot.value as? [String : AnyObject] ?? [:]
  // ...
})

这将在数据库事件link

上添加一个监听器

答案 1 :(得分:0)

我建议您使用用户名作为密钥重构您的JSON数据模型。执行此操作时,在尝试在数据库中创建重复用户时应该会出错。

答案 2 :(得分:0)

所以,我的问题与缓存或获取旧结果无关。我的一些代码逻辑依赖于检查在value的完成处理程序中传回的snapshot参数的observeSingleEvent(of:with:)。我错误地认为我可以通过将其与null进行比较来检查nil数据库值。这导致了对结果的误解。

实际检查null数据库提取的最佳方法是在exists()实例上调用FIRDataSnapshot方法。如果exists()包含非true值,则snapshot会返回null