Swift - 从 Firebase DB 中提取的数据中按最近位置排序

Posted

技术标签:

【中文标题】Swift - 从 Firebase DB 中提取的数据中按最近位置排序【英文标题】:Swift - Sorting by Nearest Location from Data pulled from Firebase DB 【发布时间】:2017-02-24 21:43:22 【问题描述】:

我正在尝试从我的 Firebase 后端检索数据 - 每个条目都有一个用户名,经纬度和经度。通过查看其他 *** 问题,我看到 CoreLocation 应该使用我尝试使用的 distancefrom (或者更确切地说,distance(from:) )方法按最近的位置进行排序。它似乎没有按预期工作。我想知道我做错了什么。

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
    

【问题讨论】:

你能把你的代码精简成MWE吗?您对 Firebase 没有任何问题,您不必证明这一点。只需显示坐标列表以及您希望它们在 tableview 中显示的顺序。 稍微删减了一下,抱歉。 【参考方案1】:

您可以尝试让GeoFire 工作。它不适用于 cocoapods,但有一些变通方法。

【讨论】:

以上是关于Swift - 从 Firebase DB 中提取的数据中按最近位置排序的主要内容,如果未能解决你的问题,请参考以下文章

如何将 firebase 函数提取到 Swift 中的对象?

Swift 3 从 Firebase 获取用户数据

如何从fireBase推送通知swift 4中获取数据

使用 swiftyJSON/swift 从 Firebase 解析排行榜数据

如何从Swift中的Cloud FireStore Firebase访问特定字段

函数没有返回,Swift Firebase