Swift 和 Firebase 首先将驱动程序整理到一个数组中

Swift and Firebase sort out drivers into an array first

我正在尝试从我的 Firebase 数据库中检索所有可用的驱动程序,然后可能将它们放在一个数组中,这样我就可以计算出哪个驱动程序更接近用户。或者有比 Array

更好的方法吗

下面是我用于检索驱动程序的代码,它正在运行,下面是我的数据库的图像 table

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)")

要从 Firebase 填充数组,我们需要获取每个驱动程序节点,获取我们感兴趣的子节点,将它们分组并将它们添加到数组中。

为此,我们将获取呈现的快照,将其映射到字典,然后通过键读取子节点。然后利用结构将距离和驱动程序名称保存在数组中。

请记住,使用 .childAdded 将遍历所有现有节点一次,然后在添加新子节点时调用闭包中的代码 - 您可能需要考虑使用 .value 读取一次节点并迭代该快照中的节点(即 .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
    })
}