根据位置Swift在Firebase中显示UITableView中的信息

时间:2016-11-02 13:25:58

标签: ios swift firebase firebase-realtime-database geofencing



我正在Swift构建一个应用程序,我有一个简单的问题。

当用户进入某个位置时(例如商店),我希望它在UITableView中显示保存在Firebase数据库中的项目列表(可以在不同的位置变化)。

我之前在Swift中做了一些位置的东西,但没有这样的。

非常感谢帮助! br />
非常感谢,你杰克。


{
  "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"
        }
      }
    }
  }
}

1 个答案:

答案 0 :(得分:1)

为了实现您的目标,您通常希望拥有存储在数据库中的咖啡馆的确切位置,即(纬度,经度)。所以你的场地结构看起来像这样

"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步重复
  5. 显然第二种方法比第一种方法更复杂,但更方便用户使用;在电池消耗方面,效率很高。

    旁注:

    1. 我分别将latitudelongitude个节点存储为Double,因此您只需将它们传递到CLLocationDegrees构造函数即可。更多info

    2. 由于您似乎对核心位置API相对较新,我建议您先创建一个辅助项目,然后了解如何在将其集成到应用程序之前执行地理围栏。 Current Location TutorialGeofencing Tutorial