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