2017-11-02 24 views
2

私は自分のテーブルビューの結果をユーザーに最も近い距離で並べ替えようとしています。私は自分の距離と距離を分けて、データをより良く保持するために距離を設定しています。私はそれがシンプルであるように感じるが、私はそれを逃していることを知っている。距離で並べ替えるテーブルビュー

距離関数がこれです:

func calculateDistance(userlat: CLLocationDegrees, userLon:CLLocationDegrees, venueLat:CLLocationDegrees, venueLon:CLLocationDegrees) -> Double { 
    let userLocation:CLLocation = CLLocation(latitude: userlat, longitude: userLon) 
    let priceLocation:CLLocation = CLLocation(latitude: venueLat, longitude: venueLon) 
    //let distance = String(format: "%.0f", userLocation.distance(from: priceLocation)/1000) 
    return userLocation.distance(from: priceLocation)/1000 
} 

PopulateData機能:

func populateData() { 
    //Pulls TableData for UITableView 
    DataService.ds.REF_VENUE.observe(.value, with: { (snapshot) in 
     self.posts = [] // THIS IS THE NEW LINE 

     if snapshot.exists(){ 
      if let snapshot = snapshot.children.allObjects as? [DataSnapshot] { 
       for snap in snapshot { 
        if let snapValue = snap.value as? [String:AnyObject], 
         let venueLat = snapValue["LATITUDE"] as? Double, 
         let venueLong = snapValue["LONGITUDE"] as? Double 
        { 
         let distance = self.calculateDistance(userlat: self.userLatt, userLon: self.userLonn, venueLat: venueLat, venueLon: venueLong) 
         if distance <= 2 { 
          let key = snap.key 
          let post = Post(postKey: key, postData: snapValue) 
          self.posts.append(post) 
         self.posts.sort(by: (posts, distance)) //Where I'm trying to sort 

         } 
        } 
       } 

       self.getDataForMapAnnotation() 
      } 
      self.tableView.reloadData() 

     } 
    }) 
} 

私は、私も辞書の配列を並べ替えることができるかどうかはわからないけど、最終目標は持っていることですtableViewは、ユーザーに最も近い会場を示します。何か提案があれば教えてください!

答えて

1

あなたがPostクラス/構造体のプロパティとして計算した距離を追加した場合、posts配列を距離でソートするのはかなり簡単です。 the Swift shorthand syntax for closuresを使用して、あなたのソート機能は次のようになります:

self.posts.sort { 
    return $0.distance < $1.distance 
} 

これは昇順で距離によってポストの配列をソートします。

+0

これはどこで最も有効でしょうか?このために新しい関数を作成する必要がありますか?これは既に持っている関数の1つの中で最もうまく実装されますか? –

+1

現在ソートを試みている場所がおそらくうまくいくでしょう。 posts配列に値を設定した後で、 'tableView.reloadData()'を呼び出す前に、どこに置いても良い場所になります。配列をソートするために別の関数を作成する必要はないと思います。 – haarismuneer

+0

私は私のポストクラス構造の一部として距離があるとは思わない。私のポストクラスでは、私は会場(つまり、緯度、経度、名前など)にmetaDataを持っています。今、私はそれを並べ替えることができることを確認するために再実行しようとしています。私が今試してみるたびに、それは距離が記事のメンバーではなく、私は正直であると少し混乱していると私に伝えます。 –

関連する問題