Firebase实时数据库查询异常:需重装APP方可获取新数据
Firebase实时数据库用户名校验失效的解决方案
问题原因
你的问题确实是Firebase实时数据库的本地缓存导致的:observeSingleEvent(of: .value)默认优先读取本地持久化缓存数据。首次安装后缓存为空,校验请求会正常拉取服务器数据;但创建账号后,本地缓存未同步新增的用户数据,后续查询仍返回旧缓存结果,重启APP无法清除持久化缓存,只有重装才能重置缓存,因此出现校验失效的情况。
解决方法
1. 强制从服务器获取最新数据(推荐)
修改查询代码,添加source: .server参数,让查询直接跳过本地缓存,请求服务器最新数据:
func singleObserveUser(withUsername username: String, completion: @escaping (UserModel) -> Void, onError: @escaping (String) -> Void) { let queryUsername = username.lowercased().trimmingCharacters(in: .whitespaces) usersRef.queryOrdered(byChild: Constants.UserData.UsernameLowercased) .queryEqual(toValue: queryUsername) // 指定从服务器获取数据,忽略本地缓存 .observeSingleEvent(of: .value, source: .server) { snapshot in if let _ = snapshot.value as? NSNull { onError("No userdata found") } else { if let dict = snapshot.value as? [String: Any] { let user = UserModel.transformDataToUser(dict: dict, id: snapshot.key) completion(user) } else { onError("No userdata found") } } } withCancel: { error in onError(error.localizedDescription) } }
2. 开启节点自动同步(适合需实时同步的场景)
如果需要用户节点保持实时同步,可以对usersRef设置keepSynced(true),让Firebase自动将服务器最新数据同步到本地缓存。但此方法会持续占用网络资源,需根据业务场景选择:
// 在初始化或合适的时机调用 usersRef.keepSynced(true)
内容的提问来源于stack exchange,提问作者Alexander Kolbin
相关产品推荐
相关产品推荐

