2017-02-07 1 views
1

Я хочу найти ближайших к вам пользователей. (Например, до 5 км) Мои узлы в firebase базе данных, как показано ниже структуры,Как запросить ближайших пользователей в Firebase с Swift?

+ users 
    + user_id0 
    - latitude: _ 
    - longitude: _ 

Есть ли способ получения точных пользователей в этом радиусе. В противном случае я должен проверить каждого пользователя из ближайшей позиции или нет, используя метод CLLocation distance.

+2

Другой вариант, если вы не хотите использовать Geofire будет запрашивать всех пользователей, которые жгутов в 5 км в любом направлении (широта/долгота), которые дадут вам больше пользователей, чем в радиусе 5 км. Затем, с этим меньшим подмножеством пользователей, сделайте сравнение расстояний CLLocation. В конечном итоге вам придется использовать это для пользователей, которые не делают сокращение (т.е. пользователи в углу, которые находятся на расстоянии 5 км в широте и долготе), но вы обязательно получите пользователей, которые непосредственно находятся в 5 км прямо N/S или E/W. – wottle

ответ

4

Я бы рекомендовал использовать 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)'") 
}) 
+0

'pod 'GeoFire', '~> 1.1'' Я получаю эти ошибки:' Firebase', требуемый 'Podfile' -' Firebase (= 3.11.0) 'требуется' Podfile.lock' - 'Firebase (~ > 2.1) 'требуется' GeoFire (1.1.0) 'Что мне делать? – tobeiosdev

+0

Вам нужно перетащить вручную с помощью заголовка моста, см. Https://github.com/firebase/geofire-objc/issues/48#issuecomment-225471865 –

Смежные вопросы