我有一个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
答案 0 :(得分:0)
Firebase数据库查询只能对单个属性进行排序/过滤。由于位置由数据库中的两个属性指示,因此目前无法对位置或距离进行排序/过滤。
Firebase有一个名为GeoFire的附加库,它通过向每个节点添加一个geohash值来添加此功能。 geohash是一个单个字符串值,它以一种方式对纬度和经度进行编码,以使Firebase可以过滤距给定点特定范围内的节点。
这将允许您查询范围内的项目,但不会得到从最近到最远的结果。使用Firebase根本不可能做到这一点,因为它无法知道服务器上的“距离”。因此,您将必须检索一定范围内的项目,然后在应用程序的客户端代码中按距离对它们进行排序。
有关同一主题的其他问题,请参见: