根据位置 Swift 在 Firebase 的 UITableView 中显示信息
Display information in UITableView from Firebase based on location Swift
我正在 Swift 构建一个应用程序,我有一个快速的问题。
当用户进入某个位置(例如商店)时,我希望它显示已保存的项目列表在 Firebase 数据库中的 UITableView 中(在不同位置可能有所不同)。
我之前在 Swift 中做过一些位置方面的工作,但没有像这样。
非常感谢您的帮助!
非常感谢,
Jake。
{
"venues" : {
"CrokePark" : {
"beverages" : {
"drink1" : "Coca-Cola",
"drink2" : "Fanta",
"drink3" : "Dr. Pepper"
},
"orders" : {
"Fanta" : {
"addedByUser" : "test2@test.com",
"completed" : false,
"name" : "Aaron"
},
"Coca-Cola" : {
"addedByUser" : "test@test.com",
"completed" : false,
"name" : "Jake"
}
}
}
}
}
为了实现您要查找的内容,您通常需要在数据库中存储咖啡馆的确切位置,即 (纬度,经度) .所以你的场地结构应该是这样的
"venues" : {
"CrokePark" : {
"latitude": 37.335556, // this is a double
"longitude": -122.009167 // this is a double
"beverages" : {
"drink1" : "Coca-Cola",
"drink2" : "Fanta",
"drink3" : "Dr. Pepper"
}
有了这个位置,你就不用担心找不回来了。一般而言,您希望在用户达到一定半径时通知用户; r,从会场。想到两种方法
糟糕的电池放电方法
始终获取他们当前位置的更新,查询数据库以查看他们当前位置是否在 r 内。如果是,通知他们然后停止获取他们的位置和查询 Firebase。
此方法最容易实施,但如果您选择它,您确实必须与您的用户有一个严重的问题。
略有改善
- 对用户的当前位置进行 SINGLE 查询。我们称之为
let currentLocation = CLLocation2D()
- 对 Firebase 进行 SINGLE 查询,检查可能在 r 内的所有位置;您甚至可以告诉 FrB 为您对它们进行排序,然后缓存结果。由于内存限制,您可能会将结果的数量限制为 10 个。关键是要避免将所有 Firebase 数据同时保存在内存中,尤其是在数据量很大的情况下。我们称之为
let possibleDestinations = []
- 启动计时器。这取决于您的用户是否步行。如果步行,那么 5-10 分钟的计时器是相当合理的。如果没有,那么您可能需要一个 1-3 分钟的计时器。
- 当
timer == expired
回滚到第 1 步时
- 是
currentLocation equal or close to any address in possibleDestinations
- 如果是;那么我们的用户肯定会前往我们已经拥有的地址之一,然后
timer.invalidate()
并显示来自 possibleDestinations
的场地信息
- 如果没有;可能用户已经改变了他们的课程,然后从步骤 2 开始重复
显然第二种方法比第一种方法复杂,但更易于使用;在电池消耗方面,高效。
旁注:
我让 latitude
和 longitude
节点分别存储 Double
以便您可以简单地将它们传递给 CLLocationDegrees
构造函数。更多 info
由于您似乎对 Core Location API 比较陌生,我建议您先创建一个辅助项目并学习如何执行地理围栏,然后再将其集成到您的应用。 Current Location Tutorial. Geofencing Tutorial.
我正在 Swift 构建一个应用程序,我有一个快速的问题。
当用户进入某个位置(例如商店)时,我希望它显示已保存的项目列表在 Firebase 数据库中的 UITableView 中(在不同位置可能有所不同)。
我之前在 Swift 中做过一些位置方面的工作,但没有像这样。
非常感谢您的帮助!
非常感谢,
Jake。
{
"venues" : {
"CrokePark" : {
"beverages" : {
"drink1" : "Coca-Cola",
"drink2" : "Fanta",
"drink3" : "Dr. Pepper"
},
"orders" : {
"Fanta" : {
"addedByUser" : "test2@test.com",
"completed" : false,
"name" : "Aaron"
},
"Coca-Cola" : {
"addedByUser" : "test@test.com",
"completed" : false,
"name" : "Jake"
}
}
}
}
}
为了实现您要查找的内容,您通常需要在数据库中存储咖啡馆的确切位置,即 (纬度,经度) .所以你的场地结构应该是这样的
"venues" : {
"CrokePark" : {
"latitude": 37.335556, // this is a double
"longitude": -122.009167 // this is a double
"beverages" : {
"drink1" : "Coca-Cola",
"drink2" : "Fanta",
"drink3" : "Dr. Pepper"
}
有了这个位置,你就不用担心找不回来了。一般而言,您希望在用户达到一定半径时通知用户; r,从会场。想到两种方法
糟糕的电池放电方法
始终获取他们当前位置的更新,查询数据库以查看他们当前位置是否在 r 内。如果是,通知他们然后停止获取他们的位置和查询 Firebase。
此方法最容易实施,但如果您选择它,您确实必须与您的用户有一个严重的问题。
略有改善
- 对用户的当前位置进行 SINGLE 查询。我们称之为
let currentLocation = CLLocation2D()
- 对 Firebase 进行 SINGLE 查询,检查可能在 r 内的所有位置;您甚至可以告诉 FrB 为您对它们进行排序,然后缓存结果。由于内存限制,您可能会将结果的数量限制为 10 个。关键是要避免将所有 Firebase 数据同时保存在内存中,尤其是在数据量很大的情况下。我们称之为
let possibleDestinations = []
- 启动计时器。这取决于您的用户是否步行。如果步行,那么 5-10 分钟的计时器是相当合理的。如果没有,那么您可能需要一个 1-3 分钟的计时器。
- 当
timer == expired
回滚到第 1 步时- 是
currentLocation equal or close to any address in possibleDestinations
- 如果是;那么我们的用户肯定会前往我们已经拥有的地址之一,然后
timer.invalidate()
并显示来自possibleDestinations
的场地信息
- 如果没有;可能用户已经改变了他们的课程,然后从步骤 2 开始重复
- 如果是;那么我们的用户肯定会前往我们已经拥有的地址之一,然后
- 是
显然第二种方法比第一种方法复杂,但更易于使用;在电池消耗方面,高效。
旁注:
我让
latitude
和longitude
节点分别存储Double
以便您可以简单地将它们传递给CLLocationDegrees
构造函数。更多 info由于您似乎对 Core Location API 比较陌生,我建议您先创建一个辅助项目并学习如何执行地理围栏,然后再将其集成到您的应用。 Current Location Tutorial. Geofencing Tutorial.