Swift 4:Geofire查询无结果输出问题求助
我之前也踩过GeoFire查询没结果的坑,结合你给出的代码片段,咱们一步步梳理可能的问题点:
确认Firebase数据库结构是否符合GeoFire要求
GeoFire存储位置时,会为每个key生成包含g(geohash字符串)和l(经纬度数组)的节点。你用geoFireRef = Database.database().reference()把根节点作为GeoFire的引用,那数据会存在根路径下的每个key节点中。要去Firebase控制台的Database面板,手动检查对应myKey的节点是否存在,且包含这两个字段。验证
setLocation是否成功执行
检查你传入的location是否是有效的CLLocation实例——比如纬度要在-90到90之间,经度在-180到180之间,非法的经纬度会导致GeoFire无法存储数据。另外确认myKey是否有正确赋值(比如不是空字符串)。检查查询代码的完整性
你没贴查询逻辑的代码,这很关键!GeoFire的查询需要通过观察者监听结果,比如用query(at:withRadius:)创建查询后,必须添加observe(.keyEntered)或其他事件监听才能获取数据。举个正确的查询示例:// 定义查询中心和半径(单位:千米) let searchCenter = CLLocation(latitude: 你的纬度, longitude: 你的经度) let radiusInKm = 5.0 let locationQuery = geoFire.query(at: searchCenter, withRadius: radiusInKm) // 监听进入查询范围的key和位置 locationQuery.observe(.keyEntered) { (key, location) in guard let key = key, let location = location else { return } print("找到匹配的key:\(key),位置:\(location.coordinate.latitude), \(location.coordinate.longitude)") } // 可选:监听查询完成事件 locationQuery.observe(.ready) { print("当前查询范围内的所有数据已加载完成") }检查Firebase数据库读写权限
如果你的数据库规则是默认的「需要用户认证才能读写」,但你的App没有完成用户登录流程,那查询请求会被Firebase拒绝,自然不会返回结果。可以临时把规则改为:{ "rules": { ".read": true, ".write": true } }测试是否能获取数据(测试完成后一定要改回严格的规则,避免数据泄露)。
确认SDK版本兼容性
确保你使用的GeoFire和Firebase SDK版本是兼容的,版本不匹配可能会导致隐藏的逻辑错误。建议升级到两者的最新稳定版本,或者查看官方文档确认兼容的版本范围。查看Xcode控制台的错误日志
打开Xcode的控制台,看看有没有Firebase相关的错误提示——比如权限被拒、数据库路径不存在、网络连接失败等,这些日志往往能直接定位问题。
内容的提问来源于stack exchange,提问作者Chandler Long

