2017-02-24 77 views
1

我試圖從我的firebase後端檢索數據 - 每個條目都有一個用戶名,lat和long。從查看其他stackoverflow問題,我發現CoreLocation應該按照距離我們嘗試使用的距離(或者距離(從:) :)方法進行排序。它似乎沒有按預期工作。我想知道我做錯了什麼。Swift - 根據從Firebase DB獲取的數據的最近位置排序DB

import UIKit 
import Firebase 
import FirebaseDatabase 
import MapKit 
import CoreLocation 

class RequestVC: UITableViewController, CLLocationManagerDelegate { 

    var locationManager = CLLocationManager() 
    var sellerUserNames = [String]() 
    var requestLocations = [CLLocationCoordinate2D]() 

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if segue.identifier == "backToMain" { 
      self.navigationController?.navigationBar.isHidden = true 
     } 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     locationManager.delegate = self 
     locationManager.desiredAccuracy = kCLLocationAccuracyBest 
     locationManager.requestWhenInUseAuthorization() 
     locationManager.startUpdatingLocation() 

     let databaseRef = FIRDatabase.database().reference() 
     databaseRef.child("Sell_Request").observe(FIRDataEventType.childAdded, with: { (FIRDataSnapshot) in 

      if let data = FIRDataSnapshot.value as? NSDictionary { 
       if let name = data[Constants.NAME] as? String { 
        if let lat = data["latitude"] as? Double { 
         if let long = data["longitude"] as? Double { 

          print("\(self.sellerUserNames) Location: Latitude: \(lat), Longitude: \(long)") 

          self.sellerUserNames.append(name) 
          self.requestLocations.append(CLLocationCoordinate2D(latitude: lat, longitude: long)) 

          self.tableView.reloadData() 

         } 
        } 
       } 
      } 
     }) 
    } 

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
     } 

    override func numberOfSections(in tableView: UITableView) -> Int { 
     return 1 
    } 

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return sellerUserNames.count 
    } 


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

     let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) 
     let location = locationManager.location?.coordinate 

     let buyerLocation = CLLocation(latitude: (location?.latitude)!, longitude: (location?.longitude)!) 
     let sellerLocation = CLLocation(latitude: requestLocations[indexPath.row].latitude, longitude: requestLocations[indexPath.row].longitude) 

     let distance = buyerLocation.distance(from: sellerLocation)/1000 

     let roundedDistance = round(distance * 100)/100 

     let distanceInMiles = roundedDistance * 0.621 
     let roundedDistanceInMiles = round(distanceInMiles * 1000)/1000 


     cell.textLabel?.text = sellerUserNames[indexPath.row] + " - \(roundedDistanceInMiles) miles away" 

     return cell 
    } 
} 
+0

您可以將代碼修剪到[MWE](http://stackoverflow.com/help/mcve)嗎?您無需展示Firebase的任何問題。只需顯示座標列表以及希望它們在tableview中顯示的順序。 –

+0

修剪了一下,抱歉。 – user2411290

回答

-1

您可以嘗試做GeoFire工作。它不適用於椰子樹,儘管有解決方法。