我尝试按帖子到当前用户的距离对帖子进行排序。 我的Firebase数据库如下所示:
POST:
USER:
我已经完成了使用此代码付款来对帖子进行排序
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周后一直在努力解决这个问题,如何使用用户和帖子的位置按距离对其进行排序。
有什么想法吗? 我真的很感激答案!
编辑:
来自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()
})
}
}
答案 0 :(得分:1)
有很多方法可以完成这项任务,但这就是我要从的开始:
用于跟踪请求并填充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 { $0.distance < $1.distance }
self.tableView.reloadData()
}
使用上面的代码,每当有新请求进入时,Firebase观察关闭都会触发并计算用户与发出请求的人之间的距离。
该请求被添加到一个数组中,然后按距离排序,然后用于显示数据的tableView被更新。
您可以对此进行扩展以考虑车辆移动,以便自动更新所有当前请求的距离等。