Swift Firebase按帖子的距离排序

时间:2017-10-23 15:19:33

标签: swift sorting firebase firebase-realtime-database distance

我尝试按帖子到当前用户的距离对帖子进行排序。 我的Firebase数据库如下所示:

POST:

enter image description here

USER:

enter image description here

我已经完成了使用此代码付款来对帖子进行排序

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()
            })
    }

}

1 个答案:

答案 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被更新。

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