Swift Firebase 按距 Post 的距离排序
Swift Firebase Sort By Distance From Post
我正在尝试根据 post 到当前用户的距离对 post 进行排序。
我的 Firebase 数据库如下所示:
POST:
用户:
我确实已经实现了使用此代码
按付款方式对我的 post 进行排序
var REF_REQUESTS = Database.database().reference().child("requests")
func observeBestPaidRequests(completion: @escaping (Request) -> Void)
{
REF_REQUESTS.queryOrdered(byChild: "pay").observeSingleEvent(of: .value, with:
{
(snapshot) in
let arraySnapshot = (snapshot.children.allObjects as! [DataSnapshot]).reversed()
arraySnapshot.forEach(
{
(child) in
if let dict = child.value as? [String: Any]
{
let request = Request.transformRequest(dict: dict, key: snapshot.key)
completion(request)
}
})
})
}
但现在我不知道,大约 1 周以来我一直在努力解决这个问题,如何使用用户和 post 的位置按距离对其进行排序。
有什么想法吗?
非常感谢您的回答!
编辑:
来自 ViewController 的代码,我试图将其附加到数组并重新加载 tableView:
@objc func loadBestPaidRequests()
{
self.requests.removeAll()
Api.requestApi.observeBestPaidRequests
{
(request) in
guard let requesterId = request.uid
else
{
return
}
self.fetchUser(uid: requesterId, completed:
{
let requestLocation = CLLocation(latitude: request.latitude!, longitude: request.longitude!)
let distanceInMeters = requestLocation.distance(from: self.mapView.userLocation.location!)
let distanceInMetersUserFriendly = Double(round(1000*distanceInMeters/1000))
self.requests.append(request)
self.tableView.reloadData()
})
}
}
有多种方法可以完成这项任务,但我将从以下方面着手:
a class 跟踪请求并填充 tableView
class RequestClass {
var requestId = ""
var userId = ""
var distance = ""
}
var requestsArray = [RequestClass]()
然后观察请求节点(这是伪代码但提供了概念)
requestsNode.observe(.childAdded.... { snapshot in
let dict = snapshot.value as! [String: Any]
let reqId = snapshot.key
let userId = dict["user_id"] as! String
let long = dict["longitute"] as! Double
let lat = dict["latitide"] as! Double
let distance = //calc distance between this user position and incoming request position
let request = RequestClass()
request.requestId = regId
request.userId = userId
request.distance = distance
self.requestsArray.append(request)
self.requestsArray.sort { [=11=].distance < .distance }
self.tableView.reloadData()
}
使用上面的代码,每当有新请求进入时,Firebase observe 闭包就会触发并计算用户与发出请求的人之间的距离。
该请求被添加到一个数组中,然后按距离排序,然后更新用于显示数据的 tableView。
您可以对此进行扩展以考虑车辆移动,因此它会自动更新所有当前请求等的距离。
我正在尝试根据 post 到当前用户的距离对 post 进行排序。 我的 Firebase 数据库如下所示:
POST:
用户:
我确实已经实现了使用此代码
按付款方式对我的 post 进行排序var REF_REQUESTS = Database.database().reference().child("requests")
func observeBestPaidRequests(completion: @escaping (Request) -> Void)
{
REF_REQUESTS.queryOrdered(byChild: "pay").observeSingleEvent(of: .value, with:
{
(snapshot) in
let arraySnapshot = (snapshot.children.allObjects as! [DataSnapshot]).reversed()
arraySnapshot.forEach(
{
(child) in
if let dict = child.value as? [String: Any]
{
let request = Request.transformRequest(dict: dict, key: snapshot.key)
completion(request)
}
})
})
}
但现在我不知道,大约 1 周以来我一直在努力解决这个问题,如何使用用户和 post 的位置按距离对其进行排序。
有什么想法吗? 非常感谢您的回答!
编辑:
来自 ViewController 的代码,我试图将其附加到数组并重新加载 tableView:
@objc func loadBestPaidRequests()
{
self.requests.removeAll()
Api.requestApi.observeBestPaidRequests
{
(request) in
guard let requesterId = request.uid
else
{
return
}
self.fetchUser(uid: requesterId, completed:
{
let requestLocation = CLLocation(latitude: request.latitude!, longitude: request.longitude!)
let distanceInMeters = requestLocation.distance(from: self.mapView.userLocation.location!)
let distanceInMetersUserFriendly = Double(round(1000*distanceInMeters/1000))
self.requests.append(request)
self.tableView.reloadData()
})
}
}
有多种方法可以完成这项任务,但我将从以下方面着手:
a class 跟踪请求并填充 tableView
class RequestClass {
var requestId = ""
var userId = ""
var distance = ""
}
var requestsArray = [RequestClass]()
然后观察请求节点(这是伪代码但提供了概念)
requestsNode.observe(.childAdded.... { snapshot in
let dict = snapshot.value as! [String: Any]
let reqId = snapshot.key
let userId = dict["user_id"] as! String
let long = dict["longitute"] as! Double
let lat = dict["latitide"] as! Double
let distance = //calc distance between this user position and incoming request position
let request = RequestClass()
request.requestId = regId
request.userId = userId
request.distance = distance
self.requestsArray.append(request)
self.requestsArray.sort { [=11=].distance < .distance }
self.tableView.reloadData()
}
使用上面的代码,每当有新请求进入时,Firebase observe 闭包就会触发并计算用户与发出请求的人之间的距离。
该请求被添加到一个数组中,然后按距离排序,然后更新用于显示数据的 tableView。
您可以对此进行扩展以考虑车辆移动,因此它会自动更新所有当前请求等的距离。