5

Firebase とそのロケーション ライブラリである GeoFire を使用するのは初めてです。現在、データを構造化するときに問題に直面しています。

現時点で、私のデータベースは次のようなものです:

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

現在ログインしているユーザーの近くにいるユーザーを照会したいと思います。そのために、指定する必要があるパスを理解できません。

現時点では、私はこのようにしています(しかし、それはうまくいきません):

現在地を保存する

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!")
   }
}

近くにいる他のユーザーを取得しています

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()
})

アップデート

現在地を保存する

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!")
   }
}

近くにいる他のユーザーを取得しています

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()
})
4

3 に答える 3

4

GeoFire の場合、ジオロケーションのみを含むセグメントをツリーに保持し、アイテムに関する他の情報を含む別のセグメントをツリーに保持する必要があります。

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"

参照: GeoFire にリンクされた Firebase データのクエリ

于 2016-02-09T21:02:23.463 に答える
2

クエリに一致するすべてのレコードを保存するには、次のようなものを使用してすべてを保存する必要があります。

    var allKeys = [String:CLLocation]()

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

        allKeys [key]=location
      }

そして使用する

    circleQuery.observeReadyWithBlock({
        print("All initial data has been loaded and events have been fired!")
    })
于 2016-02-23T03:23:37.700 に答える
0

GFEventType の設定に問題があるようです。これは、GeoFire 1.3 の次のバージョンで解決されるようです。今のところ、これを行うことができます...

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
})

ご覧のとおり、GFEventType.init(0)... は、何らかの理由で Swift の GeoFire で正しくマップされていない 3 つのタイプの列挙型にマップされます。

于 2016-03-06T03:10:41.883 に答える