2017-11-02 1 views
2

Ich versuche, die Ergebnisse meiner TabelleView nach Entfernung zu sortieren, die dem Benutzer am nächsten ist. Ich habe meine Entfernung und Funktion getrennt, um die Entfernung zu vergrößern, um meine Datenmanipulation besser in den Griff zu bekommen. Ich denke, es sollte einfach sein, aber ich weiß, dass ich es vermisse.Nach Entfernung sortieren In TableView

Die Abstandsfunktion ist dies:

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 Funktion:

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

     } 
    }) 
} 

Ich bin nicht sicher, ob ich kann sogar Art eine Reihe von Wörterbüchern, sondern das Endziel haben, ist die tableView zeigt die Orte, die dem Benutzer am nächsten sind. Wenn Sie irgendwelche Vorschläge haben, lassen Sie es mich bitte wissen!

Antwort

1

Wenn Sie die von Ihnen berechnete Entfernung als eine Eigenschaft Ihrer Post-Klasse/struct berechnet haben, wäre das Sortieren des Post-Arrays nach Entfernung ziemlich einfach. Mit the Swift shorthand syntax for closures könnte Ihre Sortierfunktion in etwa so aussehen:

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

Das die Beiträge Array nach Entfernung aufsteigend sortieren würde.

+0

Wo würde dies am besten genutzt werden? Müsste dafür eine neue Funktion erstellen oder wäre dies am besten innerhalb einer der Funktionen, die ich bereits habe, implementiert? –

+1

Wo Sie Ihren aktuellen Sortierversuch wahrscheinlich haben würde funktionieren. Wirklich überall, nachdem Sie das Posts-Array gefüllt haben und bevor Sie 'tableView.Data() 'aufrufen, wäre es ein guter Platz, um es zu setzen. Ich glaube nicht, dass Sie eine separate Funktion erstellen müssen, um das Array zu sortieren. – haarismuneer

+0

Ich glaube nicht, dass ich Abstand als Teil meiner Post-Klassenstruktur habe. In meiner Post-Klasse habe ich nur die MetaData auf den Venues (zB: lat, long, name, etc). Im Moment versuche ich das nochmal zu tun, um sicherzustellen, dass es sortiert werden kann. Jedes Mal, wenn ich es jetzt versuche, sagt es mir, dass Distanz kein Mitglied von Beiträgen ist und ich bin etwas verwirrt, um ehrlich zu sein. –

Verwandte Themen