【问题标题】:How to query multiple keys with Firebase GeoFire using Swift?如何使用 Swift 使用 Firebase GeoFire 查询多个键?
【发布时间】:2016-11-13 03:04:51
【问题描述】:

我有一个 GeoFire 查询正在返回用户 ID 或 keys。我按顺序返回keys,但我得到了几个序列。如何获取最后更新的序列?

@IBAction func friendsNearMeACTN(sender: AnyObject)
    {
        let geofireRef = self.ref.child("UserLocations")
        let geoFire = GeoFire(firebaseRef: geofireRef)
        let circleQuery = geoFire.queryAtLocation(self.location, withRadius: 20.6)
        circleQuery.observeEventType(.KeyEntered, withBlock: { (key: String!, location: CLLocation!) in
            self.localUsers.append(key)
            self.getLocalUsers()
        })
    }

func getLocalUsers()
{
    print(self.localUsers)

}

这就是我从func getLocalUsers()....返回的信息。

["WGueYzDjH4NW2vneHOyGmjf6PYB3"]
["WGueYzDjH4NW2vneHOyGmjf6PYB3", "Cg4pQj36ttNUuWNqtc16tIFmI0A2"]
["WGueYzDjH4NW2vneHOyGmjf6PYB3", "Cg4pQj36ttNUuWNqtc16tIFmI0A2", "N5pgqGEhW2f7PGGVmB3AQ8v1uPk2"]

我怎样才能简单地得到最后一个数组?

【问题讨论】:

    标签: arrays swift firebase firebase-realtime-database geofire


    【解决方案1】:

    答案是 GeoFire 查询是一个连续的异步调用,需要最终代码 observeReadyWithBlock 来提供 self.localUsers() 仅收集的信息。这是示例...

    let regionQuery = geoFire.queryWithRegion(self.region)
            regionQuery.observeEventType(.KeyEntered,  withBlock: { (key: String!, location: CLLocation!) in
                var users = [String]()
                users.append(key)
                for keys in users
                {
                    let user = keys
                    allKeys.append(user)
                }
                self.localUsers = allKeys
                self.getLocalUsers()
            })
    
            regionQuery.observeReadyWithBlock({ () -> Void in
                self.getLocalUsers()
            })
    

    【讨论】:

      【解决方案2】:

      这里的问题是每次触发观察者块时都会调用 getLocalUsers 函数。您正在为每个结果调用它。每次执行观察者块时,您都需要对结果进行计数并将计数加 1。当您的计数达到结果计数时,调用 getLocalUsers 函数一次而不是 3 次。试试下面的代码。我还没有测试过。

      @IBAction func friendsNearMeACTN(sender: AnyObject){
          var i = 0//The counter
          let geofireRef = self.ref.child("UserLocations")
          let geoFire = GeoFire(firebaseRef: geofireRef)
          let circleQuery = geoFire.queryAtLocation(self.location, withRadius: 20.6)
          circleQuery.observeEventType(.KeyEntered, withBlock: { (key: String!, location: CLLocation!) in
              self.localUsers.append(key)
              i += 1//Add one to i every time observer fires
              if i == self.key.count {//if counter (i) is equal to the keys returned call getLocalUsers func once
                  self.getLocalUsers()
              }
          })
      }
      
      func getLocalUsers(){
          print(self.localUsers)
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-12
        • 1970-01-01
        • 1970-01-01
        • 2017-03-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多