如何将Firebase数据库从最近的项目附加到我的对象(有序)?

时间:2019-07-09 09:31:20

标签: swift firebase firebase-realtime-database

我有一个Firebase数据库,其中嵌套字典附加到Firebase autoId()方法上。

Snap (donators-items) {
    "-LjGwJLdBoFugIaPMVJg" =     {
        description = "Yummy Pasta";
        latitude = "44.93926644825692";
        longitude = "4.872616600173217";
        name = "Pasta";
        pickUpDate = "2019-07-09T16:15:53+02:00";
        selectedType = "Food";
    };
    "-LjGwWkbOzeXJ6U3JO7r" =     {
        description = "Brand new shirt";
        latitude = "44.93607125515575";
        longitude = "4.878479988801786";
        name = "Cool T-shirt";
        pickUpDate = "2019-07-12T16:15:41+02:00";
        selectedType = "Clothes";
    };
}

我正在使用这种方法来检索数据库字典。

var donatorsItems = [DonatorItem]()

func fetchDonatorsItemsFromFirebase() {
  donatorsItems.removeAll()

  rootRef.child(FirebaseRoot.donatorsItems.rawValue).observe(.value) {
    (snapshot) in
    if let idDict = snapshot.value as? NSDictionary {
      let ids = idDict.allKeys
      for key in ids {
        if let nestedDict = idDict[key] as? FirebaseDictionary {

          print(nestedDict)

        }
      }
    }    
  }
}

在打印nestedDict时,我将两个嵌套字典填充到无序集合中。

如何获取数据以将其添加到DonatorItem对象中,并使用每个对象的经度和纬度按从近到远的顺序发送?

我创建了一个函数,该函数可以计算用户与对象的纬度,经度之间的距离。

func getDistanceFromUserToMeetingPoint(_ meetingPointLatitude: Double, _ meetingPointLongitude: Double, vc: UIViewController) -> Double

1 个答案:

答案 0 :(得分:0)

Firebase数据库查询只能对单个属性进行排序/过滤。由于位置由数据库中的两个属性指示,因此目前无法对位置或距离进行排序/过滤。

Firebase有一个名为GeoFire的附加库,它通过向每个节点添加一个geohash值来添加此功能。 geohash是一个单个字符串值,它以一种方式对纬度和经度进行编码,以使Firebase可以过滤距给定点特定范围内的节点。

这将允许您查询范围内的项目,但不会得到从最近到最远的结果。使用Firebase根本不可能做到这一点,因为它无法知道服务器上的“距离”。因此,您将必须检索一定范围内的项目,然后在应用程序的客户端代码中按距离对它们进行排序。

有关同一主题的其他问题,请参见: