【发布时间】:2017-10-23 15:19:33
【问题描述】:
我正在尝试按从帖子到当前用户的距离对帖子进行排序。 我的 Firebase 数据库如下所示:
发布:
用户:
我已经实现了使用此代码按付款对我的帖子进行排序
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()
})
}
}
【问题讨论】:
-
假设用户正在观察requests节点,每次有新的请求时都会向用户提供数据。一种解决方案是计算用户坐标与来自请求的传入坐标之间的距离(Haversine?)。将该距离添加到 tableView 数据源,按距离升序对其进行排序并重新加载 tableView。然后会显示发出请求的人以及与用户的距离(按距离排序)。
-
感谢您的回答,但我究竟如何按距离升序排序?
-
给定一个数组:myArray = [ 4, 2, 3, 1 ],您可以使用 Swift 数组排序技术:sortedArray = array.sorted { $0
-
我在我的问题中添加了一些代码,你可以看看它。
-
没关系,我感谢你,非常感谢你!
标签: swift sorting firebase firebase-realtime-database distance