Swift和Firebase首先将驱动程序排序为数组

时间:2018-05-27 23:53:34

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

我正在尝试从我的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)")

Database Image

1 个答案:

答案 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
    })
}