无需处理整个数据库即可恢复数据 - Google Firebase / Swift

Recover data without treating the entire database - Google Firebase / Swift

我在 iOS (Swift) 应用程序中使用新的 Google Firebase 数据库。

当用户创建一个帐户时,他会被添加到数据库中,其中包含一些参数,例如他的姓名、年龄,主要是他的当前位置(纬度/经度)。

我希望该应用能够找到他周围 XXkm 范围内的其他用户。

我是这样创建测试用户的:

for index in 1...10 {

        let profile: NSMutableDictionary = [

            "username" : "User\(index)",

        ]

        let parameters = [ // IT IS PARIS LOCATION

            "latitude" : 48.856614,
            "longitude" : 2.352222

        ]

        self.ref.child("usersTest").child("userID:\(index)").child("profile").setValue(profile)
        self.ref.child("usersTest").child("userID:\(index)").child("parameters").setValue(parameters)

    }

我是这样处理的:

// MARK: GET RANDOM USER

    refHandle = ref.observeEventType(FIRDataEventType.Value, withBlock: { (snapshot) in


        // IN THE DATABASE, I MODIFY THE USER 1 TO BE MY OWN ACCOUNT,
        // SO I CHANGE THE LOCATION TO BE DIFFERENT FROM THE OTHER
        // USERS LOCATION

        let ownUserID = "userID:1"

        let usersDict = snapshot.value!["usersTest"] as! NSDictionary

        let ownLatitude = usersDict[ownUserID]!["parameters"]!!["latitude"] as! CLLocationDegrees
        let ownLongitude = usersDict[ownUserID]!["parameters"]!!["longitude"] as! CLLocationDegrees

        let ownMaxDistance = usersDict[ownUserID]!["parameters"]!!["max_distance"] as! CLLocationDegrees

        self.myLocation = CLLocation(latitude: ownLatitude, longitude: ownLongitude)


        let usersID = usersDict.allKeys as! [String]

        for index in 0...usersID.count - 1 {

            let foundUserID = usersID[index]

            if foundUserID != ownUserID {

                let users = usersDict[foundUserID] as! NSDictionary

                self.usersArray["user\(index)"] = users

                let userParameters = self.usersArray["user\(index)"]!["parameters"] as! NSDictionary

                let latitude = userParameters["latitude"] as! CLLocationDegrees
                let longitude = userParameters["longitude"] as! CLLocationDegrees

                let userLocation = CLLocation(latitude: latitude, longitude: longitude)

                let distance = self.getDistance(userLocation, city2: self.myLocation)

                if distance < ownMaxDistance {

                    print("The user is inside your radius")

                } else {

                    print("The user is outside your radius")

                }

            }

        }

    })


// MARK: GET DISTANCE - FUNCTION

    func getDistance(city1: CLLocation, city2: CLLocation) -> CLLocationDegrees {

        let distance: CLLocationDistance = (city1.distanceFromLocation(city2)) / 1000

        return distance

    }

这种方式的问题是所有的数据库都被加载了,因为应用程序加载了数据库,然后它检查找到的用户是在你的半径 (ownMaxDistance) 之内还是之外。

我不知道如何根据找到的用户与用户之间的距离升序对找到的用户进行分类。

数据库中有 100/200 个用户没有问题,但如果数据库有数千个用户,加载所有用户会很长!

感谢您的帮助!


更新 1

明确地说,它是一个类似 Tinder 的应用程序

因为您已经在使用 Firebase。我想你也许可以用这个。它叫做 GeoFire。它是 Firebase 的一个插件。最有可能的是 quickest/easiest 前进的方式。

https://firebase.googleblog.com/2013/09/geofire-location-queries-for-fun-and.html https://github.com/firebase/geofire-objc

这里还有一个问题可能也有帮助

我找到了解决办法!我使用旧版本的 Firebase (2.5.1) 安装 GeoFire,我没有使用 Cocoapods,我使用 bridging-header 手动安装了所有框架

旧 Firebase 的

Link:https://www.firebase.com/docs/ios/

如果您在安装框架时遇到问题,请问我 ;)