使用Firebase&amp ;;检索Radius的位置数据GeoFire

时间:2016-05-17 23:47:43

标签: ios swift firebase core-location geofire

我正在尝试使用GeoFire来检索并根据半径(例如,10公里距离内的所有内容)。

为了保持清晰,我将在数据库中单独保存详细信息和位置,因此详细信息的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) {...

直到这里,数据库中的一切似乎都很好。

在检索数据时,在从核心位置获取用户的纬度和经度后,我试图:

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

observeEventType()出现了第一个问题。我不想连续观察事件。相反,像经典的TableView一样,我想要检索一次数据并显示,并使用“pull to refresh”功能重新检索数据。我的第一个问题是,GeoFire是否有任何功能可以作为Firebase的observeSingleEventOfType使用并检索一次数据?

其次,此功能会多次打印此警告:

  

[Firebase]使用未指定的索引。考虑在/ checkpointLocations中添加“.indexOn”:“g”到您的安全规则以获得更好的性能

..但不记录任何其他内容。我不认为它在函数内部,因为它不打印print("Key..部分。它也不是print("A")

我认为这可能是因为“Firebase规则”造成的。在SO上使用此answer,我尝试添加此内容:

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

还有这个:

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

但两者都不起作用。

更新

使用@ Gregg的答案,我修复了警告,但是,它仍然没有进入关闭。

1 个答案:

答案 0 :(得分:1)

没有足够的评论点,但将“.indexOn”移动到checkpointLocations节点。目前你在checkpointLocations / geofire上有它。例如:

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

      }
    }
  }