У меня есть приложение чата, и я получаю своих пользователей «рядом», используя следующий механизм:
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)