2016-02-09 9 views
5

Ich bin ziemlich neu mit Firebase und seiner Standortbibliothek GeoFire zu arbeiten. Momentan habe ich ein Problem bei der Strukturierung meiner Daten.GeoFire-Abfrage auf Benutzerstandort

Im Moment meine db ist so etwas wie folgt aus:.

users 
    facebook:xxxxx 
    displayName: xx 
    firstName: xx 
    lastName: xx 
    location: 
     g: xxxx 
     l: 
     0: xxx 
     1: xxx 
    facebook:yyyyy 
    displayName: yy 
    firstName: yy 
    lastName: yy 
    location: 
     g: yyyy 
     l: 
     0: yyy 
     1: yyy 

Ich mag würde auf Benutzer abzufragen, angemeldet in der Nähe meiner aktuellen Benutzer sind zu tun, so kann ich nicht verstehen, welchen Weg ich muss angeben.

Im Moment bin ich wie dies zu tun (aber das funktioniert nicht):

aktuellen Standort

let root = Firebase(url: "myapp.firebaseio.com") 
let usersRoot = root.childByAppendingPath("users") 
geoFire = GeoFire(firebaseRef: usersRoot.childByAppendingPath(root.authData.uid)) 

geoFire.setLocation(currentLocation, forKey: "location") { (error) in 
    if (error != nil) { 
     print("An error occured: \(error)") 
    } else { 
     print("Saved location successfully!") 
    } 
} 

Abrufen von anderen Benutzern in der Nähe von

let geoFire = GeoFire(firebaseRef: Firebase(url: "myapp.firebaseio.com").childByAppendingPath("users")) 
let query = geoFire.queryAtLocation(currentLocation, withRadius: radius) 

query.observeEventType(GFEventTypeKeyEntered, withBlock: { 
    (key: String!, location: CLLocation!) in 

    print("+ + + + Key '\(key)' entered the search area and is at location '\(location)'") 
    self.userCount++ 
    self.refreshUI() 
}) 
Spar

UPDATE

Spar aktuelle Standort

let root = Firebase(url: "myapp.firebaseio.com") 
geoFire = GeoFire(firebaseRef: root.childByAppendingPath("locations")) 

geoFire.setLocation(currentLocation, forKey: root.authData.uid) { (error) in 
    if (error != nil) { 
     print("An error occured: \(error)") 
    } else { 
     print("Saved location successfully!") 
    } 
} 

Abrufen von anderen Benutzer in der Nähe von

let geoFire = GeoFire(firebaseRef: Firebase(url: "myapp.firebaseio.com").childByAppendingPath("locations")) 
let query = geoFire.queryAtLocation(currentLocation, withRadius: radius) 

query.observeEventType(GFEventTypeKeyEntered, withBlock: { 
    (key: String!, location: CLLocation!) in 

    print("+ + + + Key '\(key)' entered the search area and is at location '\(location)'") 
    self.userCount++ 
    self.refreshUI() 
}) 

Antwort

4

Für GeoFire Sie ein Segment in dem Baum halten müssen, die nur die Geolocation enthält und dann Sie ein anderes Segment in der Struktur haben, das die anderen Informationen über die Elemente enthält.

user_locations 
    uid1: 
    g: xxxx 
    l: 
     0: xxx 
     1: xxx 
    uid2: 
    g: xxxx 
    l: 
     0: xxx 
     1: xxx 
user_profiles: 
    uid1: 
    name: "giacavicchioli" 
    uid2: 
    name: "Frank van Puffelen" 

Siehe auch: Query firebase data linked to GeoFire

+0

Danke! Ich versuche gerade, aber immer noch nicht funktioniert. Ich habe versucht, auf diese Weise (Ihre db Struktur zu berücksichtigen): lassen geoFire = GeoFire (firebaseRef: root.childByAppendingPath ("user_locations")) let query = geoFire.queryAtLocation (Currentlocation, withRadius: 10) query.observeEventType (GFEventTypeKeyEntered, withBlock: { (Schlüssel: String !, location: CLLocation!) in print ("+ + + Schlüssel '\ (key)' in den Suchbereich eingegeben und ist am Standort '\ (location)'") }) – giacavicchioli

+0

Gelöst, gab es ein Problem beim Festlegen der Abfrage-Center. Vielen Dank. – giacavicchioli

+0

Firebase Geofire-js: wie man Liste der Schlüssel von nahe durch statische (örtlich festgelegte) Positionen erhält: http://stackoverflow.com/questions/43632746/firebase-geofire-js-how-to-get-list-of-keys -von-statischfixierten Standorten –

1

alle Datensätze zu speichern, die die Abfrage Sie speichern müssen, entsprechen alle etwas mit wie:

var allKeys = [String:CLLocation]() 

    circleQuery.observeEventType(GFEventTypeKeyEntered, withBlock: { 
     (key: String!, location: CLLocation!) in 

     allKeys [key]=location 
     } 

und dann

verwenden
circleQuery.observeReadyWithBlock({ 
     print("All initial data has been loaded and events have been fired!") 
    }) 
0

Scheint, dass beim Einrichten des GFEventType ein Problem aufgetreten ist. Das wird aufgelöst scheint es auf die nächste Version von GeoFire 1.3, denn jetzt können Sie dies tun ...

let geoFire = GeoFire(firebaseRef: ref) 

var allKeys = [String:CLLocation]() 

let query = geoFire.queryAtLocation(coordinates, withRadius: 0.2) 
print("about to query") 
query.observeEventType(GFEventType.init(0), withBlock: {(key: String!, location: CLLocation!) in 
    print("Key: \(key), location \(location.coordinate.latitude)") 
    allKeys [key] = location 
}) 

Wie Sie GFEventType.init sehen (0), ..., dass die Karten für die drei Typen von Aufzählungen, die in Swift aus irgendeinem Grund nicht korrekt auf GeoFire gemappt sind.

Verwandte Themen