在 Swift 中使用 GeoFire 查询不会提供有用的输出

2023-12-11

我现在非常绝望,因为我正在尝试在 Firebase 数据库上使用 GeoFire 来查找附近的用户。 我现在已经被困了两天了。 我在 Google 和 stackoverflow 上进行了很多搜索,并尝试了在那里找到的所有内容,但没有成功。现在我最后的希望是自己创建这个线程并希望有人可以帮助我。

我的数据库几乎是这样的:

users
    user_id1
        email: [email protected]
        username: xxx
    user_id2
        email: [email protected]
        username: yyy
users_locations
    user_id1
        location
            g: xxxx
            l
                0: 30.0000
                1: 5.0000
    user_id2
        location
            g: yyyy
            l
                0: 30.0010
                1: 5.0010

我不知道是否有必要将位置数据与用户分开保存,但我也尝试像这样保存它并获得相同的结果,所以我认为这并不重要:

users
    user_id1
        email: [email protected]
        username: xxx
        location
            g: xxx
            l
                0: 30.0000
                1: 5.0000

现在我正在使用的代码:

要将位置写入数据库,我使用以下命令,效果很好:

let user = FIRAuth.auth()?.currentUser
let uid = user?.uid

let ref = FIRDatabase.database().reference()
let geofireRef = ref.child("users_locations")
let geoFire = GeoFire(firebaseRef: geofireRef.child(uid!))

geoFire?.setLocation(myLocation, forKey: "location")

现在,我尝试使用 GeoFire 查询向我显示定义半径内的所有用户,但该用户不打印任何内容:

let ref = FIRDatabase.database().reference()
let geofireRef = ref.child("users_location")
let geoFire = GeoFire(firebaseRef: geofireRef)

let circleQuery = geoFire?.query(at: center, withRadius: 10)
circleQuery?.observe(.keyEntered, with: { (key: String?, location: CLLocation?) in
         print("Key '\(key!)' entered the search are and is at location '\(location!)'")
    })

我发现如果我去找我真正的 uid 孩子,我就会得到结果。然后它打印我的实际用户位置和密钥,但这当然不是我想要的。

let geoFire = GeoFire(firebaseRef: geofireRef.child(uid!))

因此,我希望 GeoFire 在“users_locations”中搜索我的 uid,并返回我定义的半径内的所有 uid。

对我来说,它似乎只是在我的参考(users_location -> user_uid)中定义的子项中搜索名为“location”的子项,如果我尝试查询“users_location”,我什么也得不到。

我究竟做错了什么? 如何使查询搜索引用子项并返回 uid?


使用 Geofire 时,您有两个数据列表:

  1. 对象列表,在您的情况下是用户
  2. 这些对象的位置列表,通过 Geofire 维护和查询

这两个列表确实是分开的。来自Geofire 文档(强调我的):

假设您正在构建一个对酒吧进行评级的应用程序,并且您存储了酒吧的所有信息,例如名称、营业时间和价格范围,位于/bars/<bar-id>。稍后,您希望添加用户搜索其附近酒吧的可能性。这就是 GeoFire 发挥作用的地方。

您可以使用 GeoFire 存储每个酒吧的位置,使用 bar ID 作为 GeoFire 键。然后,GeoFire 可以让您轻松查询附近有哪些酒吧 ID(钥匙)。要显示有关柱形图的任何其他信息,您可以加载查询返回的每个柱形图的信息:/bars/<bar-id>.

对于您的问题,我强调了两个最重要的部分:

  1. 用户列表中的项目及其位置列表应该使用相同的密钥(这也是安德鲁在他的回答中指出的)。通过使用相同的密钥,您可以轻松地查找用户的位置,反之亦然。
  2. 您将需要为查询中的每个键单独加载用户。

Andrew 展示了如何正确编写每个用户的位置。剩下的就是加载有关结果范围内每个用户的附加信息。你会在他身上这样做.keyEntered处理程序:

let usersRef = ref.child("users")

let circleQuery = geoFire?.query(at: center, withRadius: 10)
circleQuery?.observe(.keyEntered, with: { (key: String?, location: CLLocation?) in

     print("Key '\(key!)' entered the search are and is at location '\(location!)'")
     // Load the user for the key
     let userRef = usersRef.child(key)
     userRef.observeSingleEvent(FIRDataEventType.value, with: { (snapshot) in
         let userDict = snapshot.value as? [String : AnyObject] ?? [:]
         // ...
     })
})
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Swift 中使用 GeoFire 查询不会提供有用的输出 的相关文章

随机推荐

  • Python 相当于 JavaScript 函数对象

    我想知道是否有Python相当于这个JavaScript构造 var myFunctions greet function name return Hello name farewell function time return See y
  • SHA1 C# 相当于此 Java

    在 C 中寻找与此方法相同的等效项 try MessageDigest md MessageDigest getInstance SHA 1 md update password getBytes BigInteger hash new B
  • 非英文字符在我的 php 页面上显示为问号 - 在数据库中显示正常

    我有一个 MySQL 数据库表 其中填充了非英语数据 当我在 Navicat MySQL 浏览器中查看数据时 数据显示正常 但是 当我运行 php 脚本来选择并在网页上显示数据时 它会显示问号 页面编码设置为 utf8 甚至 MySQL 排
  • 如何在Matlab中进行GF(2)的逆运算和GF(256)的乘法?

    我有一个二进制矩阵A only 1 and 0 和一个向量D在伽罗瓦域 256 向量C计算如下 C A 1 D where A 1表示矩阵的逆矩阵A in GF 2 是乘法运算 结果向量C必须在GF 256 我尝试用Matlab来做 A 1
  • Windows 身份验证的 asp.net mvc 应用程序中每个资源(2 x 401.2 和 1 x 200)有 3 个请求

    当我拉出 Fiddler 并意识到每个请求都被发送了 3 次 两次我得到 401 2 然后成功 时 我试图找出为什么我的网站在 IE9 中如此缓慢 我验证了这种情况在所有浏览器上都会发生 只是 Chrome 的速度掩盖了这一点 或者这可能与
  • 递归斐波那契函数(带负数)

    我可以为所有大于 0 的数字编写递归斐波那契函数 但该函数对于任何负数都是完全错误的 知道如何在 C 中实现这个吗 int fibonacci int n if n 0 return 0 if n 1 return 1 return fib
  • Vagrant 端口转发不起作用

    我已经在我的电脑上安装了 CouchDBvagrant 0 9 0正在运行的盒子CentOS 6 2 In 流浪文件我已经添加config vm forward port 5984 5985 重新加载流浪汉后 我尝试卷曲地址 curl v
  • 如何在C++中将较大的字符串减少为较小的字符串?可能是通过散列?

    我想在 C 中将较大的字符串压缩为较小的字符串 在 C 中执行此操作有哪些不同的方法 要求是输出也应该是字符串 好吧 如果您以后不需要解压缩它 string s xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx s E
  • 在 geom_密度_脊上画线

    我试图在 ggridges 的密度图中画一条线 library ggplot2 library ggridges ggplot iris aes x Sepal Length y Species geom density ridges re
  • 将 Excel 中的值除以一组预设值,以找出每个值需要多少个

    我很好奇是否有办法让我的生活更轻松 在 Excel 中 我生成一个总值 例如 750 并且需要从 50 100 200 250 500 的值中找出我需要多少个管道订单 无论如何 有没有办法让excel取一个值 然后返回我需要的每个数字的数量
  • 如何更改绘图标题和轴标签的字体大小并保存?

    每次我将绘图图片保存为 jpg 或 png 时 标题和轴标签的字体大小都会自动更改回默认值 我的代码是这样的 figure plot x f x title the smallest n 1 FontSize 24 xlabel x Fon
  • SQL排序不遵循group by语句,总是使用主键

    我有一个 SQL 数据库 其中有一个名为staff 具有以下列 workerID Prim key name department salary 我应该找到每个部门工资最高的工人 并使用以下语句 select staff workerID
  • ColdFusion CFHTTP 和 SSL 证书

    背景 当我尝试使用 CFHTTP 连接到 API 时 我一直遇到连接失败错误消息的问题 在查看 SoapUI 中的 API 时 我注意到有一个按钮SSL Info 3 certs 概述如下 当我单击该按钮时 会弹出一个副本窗口 其中概述了下
  • Android 设备 adb 在 linux/Mac 上始终未经授权

    我不得不处理这个问题几次 每次我都会忘记原因是什么 直到我深入挖掘 所以这是症状 每次重新连接 重新启动设备时 您都会收到授权对话框 即使您可以swear你检查了Always上次勾选了 adb shell给你下面的简介 adb device
  • 为什么在 C 中执行算术运算后会丢失值的余数?

    我正在尝试通过遵循以下内容来学习基本的 C 编程textbook我一定遗漏了一些关于数据类型 舍入和 或运算顺序的信息 因为当我尝试构建一个简单的程序将秒转换为小时和分钟时 小时有效 但剩余分钟在它们出现时变为 0不应该是 谢谢Course
  • 如何将外部 HTML 文件导入 TypeScript 类

    我正在尝试构建一个正在使用的 JavaScript 包Webpack将 TypeScript 文件及其所有导入编译为单个 JavaScript 文件 该包的主要目标是按照一组给定的条件向任何使用该包的应用程序输出 HTML 目前 我通过使用
  • Django Admin 中有“DetailView”吗?

    我知道 Django 管理中有一个更改 更新视图 但是是否有任何详细视图仅列出记录的属性 有点像 Django 应用程序中的 DetailView 或者有人知道我可以安装任何第三方软件包来提供相同的功能吗 我最近也在调查这个问题 一种有效的
  • 查询 JSON 列中数组的元素

    最近升级到使用 PostgreSQL 9 3 1 来利用 JSON 功能 在我的表中 我有一个 json 类型列 其结构如下 id 123 name foo emails id 123 address somethinghere id 45
  • 对数组进行排序的最小“插入”次数

    假设有一个无序列表 我们唯一能做的操作就是移动一个元素并将其插入回任何位置 对整个列表进行排序需要多少步 我想答案是size of the list size of longest ordered sequence 但我不知道如何证明这一点
  • 在 Swift 中使用 GeoFire 查询不会提供有用的输出

    我现在非常绝望 因为我正在尝试在 Firebase 数据库上使用 GeoFire 来查找附近的用户 我现在已经被困了两天了 我在 Google 和 stackoverflow 上进行了很多搜索 并尝试了在那里找到的所有内容 但没有成功 现在