【问题标题】:Swift Firebase Sort By Distance From PostSwift Firebase 按与帖子的距离排序
【发布时间】: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


【解决方案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。

您可以对此进行扩展以考虑车辆移动,以便自动更新所有当前请求的距离等。

【讨论】:

    猜你喜欢
    • 2018-02-02
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    相关资源
    最近更新 更多