2017-10-23 1 views
0

Ich versuche, die Beiträge nach der Entfernung von der Post an den aktuellen Benutzer zu sortieren. My Firebase-Datenbank sieht wie folgt aus:Swift Firebase Sortieren nach Entfernung von Beitrag

POST:

enter image description here

USER:

enter image description here

Ich habe bereits erreichen, um meine Beiträge durch die Zahlung zu sortieren mit diesem Code

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

Aber jetzt weiß ich nicht und habe seit etwa 1 Woche daran gekämpft, wie man es mit Hilfe der Benutzer und der Position der Post nach der Entfernung sortiert.

Irgendwelche Ideen? Ich würde wirklich eine Antwort zu schätzen wissen!

EDIT:

-Code aus dem Viewcontroller, wo ich versuche, es auf das Array anhängen und laden Sie die 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() 
      }) 
    } 

}

+0

Unter der Annahme, dass der Benutzer die Anfragen Knoten beobachtet, dann ist jedes Mal eine neue Anforderung, dass Daten wird dem Benutzer zur Verfügung gestellt. Eine Lösung wäre, den Abstand zwischen Benutzerkoordinaten und den eingehenden Koordinaten aus der Anfrage zu berechnen (Haversine?). Fügen Sie diese Entfernung zu einer tableView dataSource hinzu, sortieren Sie sie aufsteigend nach Entfernung und laden Sie die tableView neu. Das würde dann die Person, die die Anfrage gemacht hat, und die Entfernung vom Benutzer nach Entfernung anzeigen. – Jay

+0

Danke für die Antwort, aber wie genau sortiere ich es aufsteigend nach Entfernung? – Noah

+0

Bei einem Array: myArray = [4, 2, 3, 1] können Sie die Swift-Array-Sortiermethode verwenden: sortedArray = array.sorted {$ 0 <$ 1}. Alles, was Sie tun müssen, ist, die aktuellen Benutzerkoordinaten x0, y0 und die eingehenden Anforderungskoordinaten x1, y1 zu nehmen, die Entfernung zu berechnen und die Ergebnisse dem Array hinzuzufügen. Dann sortiere das Array und lade die tableView neu. – Jay

Antwort

0

eine Reihe von Möglichkeiten gibt es zu tun Diese Aufgabe, aber hier ist, was ich damit anfangen würde:

eine Klasse, um Anfragen verfolgen und füllen Sie eine TabelleView

class RequestClass { 
    var requestId = "" 
    var userId = "" 
    var distance = "" 
} 

var requestsArray = [RequestClass]() 

dann die Anfragen Knoten beobachten (dies ist Pseudo-Code stellt aber das Konzept)

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

mit dem obigen Code, jedes Mal, wenn eine neue Anforderung eintrifft, beobachtet die Firebase Verschluss Brände und berechnet den Abstand zwischen dem Benutzer und der Person, die die Anfrage stellt.

Diese Anforderung wird zu einem Array hinzugefügt und dann nach Entfernung sortiert. Anschließend wird die tableView aktualisiert, die zum Anzeigen der Daten verwendet wird.

Sie auf diese erweitern können in Rechnung, ein Fahrzeug zu nehmen bewegt, so wird es automatisch den Abstand zu allen aktuellen Anfragen aktualisieren usw.

Verwandte Themen