GeoFire: как эффективно извлекать пользовательские данные - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть приложение чата, и я получаю своих пользователей «рядом», используя следующий механизм:

override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.        

        geoFireRef = Database.database().reference().child("Geolocs")

        geoFire = GeoFire(firebaseRef: geoFireRef)

        let userLat = UserDefaults.standard.value(forKey: "current_latitude") as! String
        let userLong = UserDefaults.standard.value(forKey: "current_longitude") as! String

        let location:CLLocation = CLLocation(latitude: CLLocationDegrees(Double(userLat)!), longitude: CLLocationDegrees(Double(userLong)!))

        myQuery = geoFire?.query(at: location, withRadius: 100)

        myQuery?.observe(.keyEntered, with: { (key, location) in

           // print("KEY:\(String(describing: key)) and location:\(String(describing: location))")

            SwiftOverlays.showTextOverlay(self.view, text: "Searching for nearby users...")

            if key != Auth.auth().currentUser?.uid
            {
                let ref = Database.database().reference().child("Users").child(key!)

                ref.observeSingleEvent(of: .value, with: { (snapshot) in
                    let id = snapshot.key
                    let data = snapshot.value as! [String: Any]
                    let credentials = data["user_details"] as! [String: String]

                    let name = credentials["name"]!
                    let email = credentials["email"]!
                    let latitude = credentials["current_latitude"]
                    let longitude = credentials["current_longitude"]
                    let link = URL.init(string: credentials["profilepic_url"]!)
                    URLSession.shared.dataTask(with: link!, completionHandler: { (data, response, error) in
                        if error == nil {
                            let profilePic = UIImage.init(data: data!)
                            let user = User.init(name: name, email: email, id: id, profilePic: profilePic!, latitude: latitude! , longitude:longitude! )

                            DispatchQueue.main.async {
                                SwiftOverlays.removeAllBlockingOverlays()
                                self.items.append(user)
                                self.tblUserList.reloadData()
                            }

                        }
                    }).resume()

                })
            }
            else
            {
                DispatchQueue.main.async {
                    SwiftOverlays.removeAllBlockingOverlays()
                }
            }
        })

    }

К сожалению, Geofire возвращает один ключ за раз, а не все ключи в массиве.

Проблема в том, что после получения пользовательских данных этот код выполняет reloadData(), что приводит к огромному количеству UITableView перезагрузок, поскольку в моем радиусе поиска могут быть тысячи пользователей.

Я хотел бы получить свои данные, поработать с ними (применить фильтры и т. Д.), И когда я закончу с этим, сделаю чистую команду reloadData().

Есть ли лучший способ сделать это?

(Источник: https://medium.com/@hiren.patel93/using-geofire-with-firebase-in-ios-mobile-application-ce54a3fbea83)

...