我正在尝试从我的Firebase数据库中检索所有可用的驱动程序,然后将它们放在一个数组中,这样我就可以计算哪个驱动程序更靠近用户。或者有比Array
更好的方法这是我的代码下面的检索驱动程序,它的工作和下面是我的数据库表的图像
ref.child("drivers").queryOrdered(byChild: "status").queryEqual(toValue: "available").observe(.childAdded) { (snapshot) in
print(snapshot.value!)
}
这是一个代码,可以找出最接近用户的驱动程序,但我需要先将驱动程序整理成数组
var closestLocation: CLLocation?
var smallestDistance: CLLocationDistance?
for location in locations {
let distance = currentLocation.distanceFromLocation(location)
if smallestDistance == nil || distance < smallestDistance {
closestLocation = location
smallestDistance = distance
}
}
print("smallestDistance = \(smallestDistance)")
答案 0 :(得分:0)
要从Firebase填充数组,我们需要获取每个驱动程序节点,获取我们感兴趣的子节点,将它们分组并将它们添加到数组中。
为此,我们将采用呈现的快照,将其映射到字典,然后通过其键读取子节点。然后利用Structure来保持数组中的距离和驱动程序名称。
请记住,使用.childAdded将迭代所有现有节点一次,然后在添加新子节点时调用闭包中的代码 - 您可能需要考虑使用.value和iterate读取节点一次取而代之的是该快照中的节点(即.observeSingleEvent(of:。value))
这里有一些非常详细的代码来读取你的驱动程序节点并添加它们,以及它们与当前位置之间的距离为数组。
请注意Firebase是异步的,因此处理数组距离应在闭包内完成,此代码后面的任何代码都将在此代码完成之前运行。
struct DriverAndDistance {
var driver = ""
var distance = 0.0
}
var driverArray = [DriverAndDistance]()
func readDriversAndAddObserver() {
let driversRef = self.ref.child("drivers")
driversRef.observe(.childAdded, with: { snapshot in
if snapshot.exists() == false { return }
let dict = snapshot.value as! [String: Any]
let firstName = dict["Firstname"] as! String
let long = dict["long"] as! Double
let lat = dict["lat"] as! Double
let distanceFromHere = self.getDistance(long, lat)
let dd = DriverAndDistance(driver: firstName, distance: distanceFromHere)
self.driverArray.append(dd)
//do calculations here and present data to user
})
}