2016-08-09 15 views
6

Eksperymentowałem z Geofire for iOS, ale nie mogę znaleźć sposobu na zwrócenie odległości z pozycji wyszukiwania w zapytaniu o okrąg. GFQueryResultBlock zwraca tylko klucz i pozycję. Czy mam rację, zakładając, że sam muszę obliczyć odległość?Zamawianie wyników Geofire na odległość

Załóżmy, że robię pobliską aplikację restauracyjną z Firebase i chcę wyświetlić 20 najbliżej położonych restauracji, uporządkowanych według tego, jak blisko są. Mogę utworzyć kwerendę okrąg, a następnie zwiększyć zasięg wyszukiwania za pośrednictwem pętli, aż znajdę 20 restauracji. Następnie obliczyć odległość dla każdego z nich i posortować je przed wyświetleniem ich użytkownikowi. Czy jest to rozsądne podejście, biorąc pod uwagę, że w aplikacji wykonuje się dużą ilość pracy w celu uporządkowania danych (obliczanie odległości: sortowanie na odległość: &)?

Zauważyłem, że javascript Geofire pyta o numer return distance from the center, ale domyślam się, że wersje na iOS i android różnią się od tego.

+1

Nie ma żadnej szkody w podejściu. A jeśli używasz jednej z procedur sortowania dostarczonych przez iOS, jest to bardzo szybkie. Używam tego samego podejścia do jednej z moich aplikacji i nigdy nie spotkałem się z żadnym problemem. Ponieważ Geofire zwraca wyniki stopniowo, wszystkie kolejne wstawienia odbywają się w log (n), co jest dość wydajne. Przypuszczam, że nie zajmujesz się obiektami rzędu tysięcy. – kdeo

+0

Firebase geofire-js: jak uzyskać listę kluczy w pobliżu lokalizacji statycznych (stałych): http://stackoverflow.com/questions/43632746/firebase-geofire-js-how-to-get-list-of-keys -of-near-by-staticfixed-locations –

Odpowiedz

3

Podczas zapytania w Geofire odpowiednie wyniki są automatycznie sortowane według kolejności rosnącej. Tak, aby uzyskać dystans, jestem tylko przy użyciu funkcji distanceFromLocation: Oto mój kod:

func getGeoFirePlaces(){ 

    let geofireRef = FIRDatabase.database().reference().child("testForGeofire") 
    let geoFire = GeoFire(firebaseRef: geofireRef) 
    //geoFireRef is pointing to a firebase reference where I previously set all places' location 
    let userPosition = CLLocation(latitude: 32.0776067, longitude: 34.78912) 
    let circleQuery = geoFire.queryAtLocation(userPosition, withRadius: 2) 

    circleQuery.observeEventType(.KeyEntered, withBlock: { (key: String!, location: CLLocation!) in 
     print("Key '\(key)' entered the search area and is at location '\(location)'") 

     //getting distance of each Place return with the callBack 
     let distanceFromUser = userPosition.distanceFromLocation(location) 
     print(distanceFromUser) 
    }) 

} 

nadzieję, że to pomaga!

+0

Firebase geofire-js: jak zdobyć listę kluczy w pobliżu statycznych (ustalonych) lokalizacji: http://stackoverflow.com/questions/43632746/firebase-geofire-js-how -to-get-list-of-keys-of-near-by-staticfixed-lokalizacje –