2017-10-23 23 views
0

投稿から現在のユーザーまでの距離で投稿を並べ替えようとしています。 私Firebaseデータベースは、次のようになります。Swift 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週間からこれを苦労しています。ユーザーと場所を使って遠く離れて並べ替える方法。

アイデア? 私は本当に答えを感謝します!

編集:私は、配列にそれを追加してのtableViewを再ロードしようとしているのViewControllerから

コード:

@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つの解決策は、要求からのユーザーコードと着信コード間の距離を計算することです(Haversine?)。その距離をtableViewデータソースに追加し、距離距離で昇順にソートし、tableViewをリロードします。そうすると、リクエストを行った人物と、距離でソートされたユーザからの距離が表示されます。 – Jay

+0

答えをありがとう、しかし、私はどのように正確に私はそれを距離で昇順に並べ替えるのですか? – Noah

+0

配列myArray = [4,2,3,1]を使用すると、Swift配列ソート手法を使用できます。sortedArray = array.sorted {$ 0 <$ 1}。あなたがする必要があるのは、現在のユーザーコードx0、y0と着信要求コードx1、y1を取得し、距離を計算し、結果を配列に追加することだけです。その後、配列をソートし、tableViewをリロードします。 – Jay

答えて

0

達成するために、いくつかの方法がありますこのタスクはここから始まります:

リクエストを追跡してテーブルを作成するクラス

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が更新されます。

それは自動的に現在のすべての要求に距離を更新しますので、あなたは、ユーザーが要求ノードを観測していることを、そのデータの新しい要求がありますたびに仮定し

関連する問題