背景:
我有一个应用程序,新用户填写注册表单(包括用户名,电子邮件和密码)以注册帐户。当新用户提交表单时,应用会检查其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进行开发。
答案 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
。