2016-05-17 20 views
1

私はGeoFireを使用して、半径(例えば、10kmの距離のすべて)を取得しようとしています。FirebaseとGeoFireを使用して半径を使って位置データを取得する

明確にするため、私は詳細と場所をデータベースに別々に保存していますので、詳細は 'idは場所のIDと同じです。データを保存している間、私が使用します。

var details = ["a":"a", "b":"b", etc] 
let checkpointRef = eventRef.childByAutoId() 
checkpointRef.setValue(details) 
let checkpointId = checkpointRef.key 

let geofireRef = ref.childByAppendingPath("checkpointLocations") 
let geoFire = GeoFire(firebaseRef: geofireRef) 

geoFire.setLocation(CLLocation(latitude: usersLatitude, longitude: userLongitude), forKey: checkpointId) {... 

ここまでは、すべてがデータベースに罰金です。第一の問題は、observeEventType()とここに発生する

func retrieve() { 
    let geofireRef = Firebase(url: self.baseurl + "/checkpointLocations") 
    let geoFire = GeoFire(firebaseRef: geofireRef) 

    let center = CLLocation(latitude: usersLatitude, longitude: usersLongitude) 

    var circleQuery = geoFire.queryAtLocation(center, withRadius: 10) 

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

:に


データを取得しているときには、コアの場所からユーザーの緯度と経度を取得した後、私がしようとしています。私はイベントを継続的に観察したくありません。代わりに、古典的なTableViewのように、データを一度取得して表示し、「プル・トゥ・リフレッシュ」機能でデータを再取得したいと考えています。私のの最初の質問は、GeoFireがFirebaseのobserveSingleEventOfTypeとして動作し、一度データを取得する機能はありますか?不特定のインデックスを使用して[Firebase]


は第二に、この関数は、時間のこの警告カップルを印刷しています。より良いパフォーマンスのために、セキュリティルールに ".indexOn": "g"を追加することを検討してください。

しかし、これ以外のログは記録されません。私はそれがprint("Key..部分を印刷しないので、関数の中に入るとは思わない。それもprint("A")ではありません。

「Firebase Rules」のために発生している可能性があります。

"rules": { 
    "checkpointLocations": { 
     "$key": { 
     ".read": true, 
     ".write": true, 
     "geofire": { 
      ".indexOn": "g" 
     } 
     } 
    } 
    } 

もこの:

"rules": { 
    "checkpointLocations": { 
     ".read": true, 
     ".write": true, 
     "geofire": { 
     ".indexOn": "g" 
     } 
    } 
    } 

しかし、どちらの作品をSOにこのanswerを使用して、私はこれを追加してみました。

更新:グレッグの答え@使用

、私はしかし、それはまだ閉鎖の内側に行かない、警告を修正しました。

答えて

1

コメントには十分な点がありませんが、 ".indexOn"はcheckpointLocationsノードまで移動してください。現在、あなたはcheckpointLocations/geofireにそれを持っています。例:

"rules": { 
    "checkpointLocations": { 
     ".read": true, 
     ".write": true, 
     ".indexOn": "g" 
     "geofire": { 

     } 
    } 
    } 
+0

ありがとうございます!それは警告を修正した。しかし、それは閉鎖の中のものを印刷していません。理由は何ですか?私はエラーが問題だと思ったが、明らかにそうではなかった。 – senty

+0

編集:まったく私の間違いだった。コアの場所を取得する前に取得しようとしています。巨大な感謝! – senty

+0

'' .indexOn "'に '.'をどのように追加できましたか?私がしようとするたびに、キーとして '.'を挿入できないというエラーが表示されます – KellysOnTop23

関連する問題