根据位置 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。

此方法最容易实施,但如果您选择它,您确实必须与您的用户有一个严重的问题。

略有改善

  1. 对用户的当前位置进行 SINGLE 查询。我们称之为 let currentLocation = CLLocation2D()
  2. 对 Firebase 进行 SINGLE 查询,检查可能在 r 内的所有位置;您甚至可以告诉 FrB 为您对它们进行排序,然后缓存结果。由于内存限制,您可能会将结果的数量限制为 10 个。关键是要避免将所有 Firebase 数据同时保存在内存中,尤其是在数据量很大的情况下。我们称之为 let possibleDestinations = []
  3. 启动计时器。这取决于您的用户是否步行。如果步行,那么 5-10 分钟的计时器是相当合理的。如果没有,那么您可能需要一个 1-3 分钟的计时器。
  4. timer == expired回滚到第 1 步时
    • currentLocation equal or close to any address in possibleDestinations
      1. 如果是;那么我们的用户肯定会前往我们已经拥有的地址之一,然后 timer.invalidate() 并显示来自 possibleDestinations
      2. 的场地信息
      3. 如果没有;可能用户已经改变了他们的课程,然后从步骤 2 开始重复

显然第二种方法比第一种方法复杂,但更易于使用;在电池消耗方面,高效。

旁注:

  1. 我让 latitudelongitude 节点分别存储 Double 以便您可以简单地将它们传递给 CLLocationDegrees 构造函数。更多 info

  2. 由于您似乎对 Core Location API 比较陌生,我建议您先创建一个辅助项目并学习如何执行地理围栏,然后再将其集成到您的应用。 Current Location Tutorial. Geofencing Tutorial.