Ios 使用Firebase&;检索半径为的位置数据;地火

Ios 使用Firebase&;检索半径为的位置数据;地火,ios,swift,firebase,core-location,geofire,Ios,Swift,Firebase,Core Location,Geofire,我正在尝试使用GeoFire检索并根据半径(例如,10km距离内的所有内容) 为了保持清晰,我将在数据库中分别保存详细信息和位置,因此详细信息的id与位置的id相同。在保存数据时,我使用: var details = ["a":"a", "b":"b", etc] let checkpointRef = eventRef.childByAutoId() checkpointRef.setValue(details) let checkpointId = checkpointRef.key

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

为了保持清晰,我将在数据库中分别保存详细信息和位置,因此详细信息的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一样,我希望检索数据一次并显示,然后使用“拉入刷新”功能重新检索数据。我的第一个问题是,GeoFire是否有任何功能可以充当Firebase的
观察类型
的单个事件并一次检索数据


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

[Firebase]使用未指定的索引。考虑在您的安全规则中添加“.Noxon”:“G”AT /检查点位置,以获得更好的性能< /P> …但不记录任何其他内容。我认为它不在函数内部,因为它不打印
打印(“Key..
部分)。它也不打印
打印(“A”)

我认为这可能是由于“Firebase规则”造成的。因此,我尝试添加以下内容:

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

 "rules": {
    "checkpointLocations": {
      ".read": true,
      ".write": true,
      "geofire": {
        ".indexOn": "g"
      }
    }
  }
但两者都不起作用

更新:


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

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

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

      }
    }
  }

谢谢!它修复了警告。但是它没有在闭包中打印内容。你知道为什么吗?我认为错误是问题所在,但显然不是。编辑:完全是我的错误。在获取核心位置之前尝试获取。非常感谢!你是如何为
”添加
。indexOn“
?每次尝试时,我都会遇到一个错误,即无法将
作为密钥插入