Я бы рекомендовал использовать Geofire для чего-то подобного.
Чтобы настроить его, структура данных немного изменится. Вы все еще можете хранить LAT/LNG на ваших пользователей, но вы также создать новый Firebase стол под названием что-то вроде users_locations
Ваш users_locations
таблица будет заполняться через Geofire, и будет выглядеть примерно так
users_locations
user_id0:
g: 5pf666y
l:
0: 40.00000
1: -74.00000
В общем, так вы можете сохранить местоположение в Geofire, но вы можете настроить его для сохранения, когда создается или обновляет местоположение вашего пользовательского объекта.
let geofireRef = FIRDatabase.database().reference().child("users_locations")
let geoFire = GeoFire(firebaseRef: geofireRef)
geoFire.setLocation(CLLocation(latitude: lat, longitude: lng), forKey: "user_id0")
Когда вы сохранили свои места в users_locations
, вы можете использовать GFQuery
для запроса всех пользователей в определенном диапазоне.
let center = CLLocation(latitude: yourLat, longitude: yourLong)
var circleQuery = geoFire.queryAtLocation(center, withRadius: 5)
var queryHandle = circleQuery.observeEventType(.KeyEntered, withBlock: { (key: String!, location: CLLocation!) in
println("Key '\(key)' entered the search area and is at location '\(location)'")
})
Другой вариант, если вы не хотите использовать Geofire будет запрашивать всех пользователей, которые жгутов в 5 км в любом направлении (широта/долгота), которые дадут вам больше пользователей, чем в радиусе 5 км. Затем, с этим меньшим подмножеством пользователей, сделайте сравнение расстояний CLLocation. В конечном итоге вам придется использовать это для пользователей, которые не делают сокращение (т.е. пользователи в углу, которые находятся на расстоянии 5 км в широте и долготе), но вы обязательно получите пользователей, которые непосредственно находятся в 5 км прямо N/S или E/W. – wottle