Jacobo Koenig
Jacobo Koenig

Reputation: 12514

Check if no nearby locations with GeoFire

I'm trying to search for nearby registered locations using GeoFire, and return a default value if there are none within the specified radius. My problem is that when GeoFire doesn't find anything nearby, it returns absolutely nothing. Is there a different way to do this?

    let geoFire = GeoFire(firebaseRef: DataService().LOC_REF)
    let myLoc = CLLocation(latitude: 10.500000, longitude: -100.916664)
    let circleQuery = geoFire.queryAtLocation(myLoc, withRadius: 100.0)
    circleQuery.observeEventType(GFEventType.KeyEntered, withBlock: {
        (key: String!, location: CLLocation!) in
        self.allKeys[key]=location
        print(self.allKeys.count) //NOT GETTING HERE
        print(key)
        //from here i'd like to use the key for a different query, or determine if there are no keys nearby
            }
        })
    })

Thanks in advance

Upvotes: 1

Views: 1044

Answers (2)

Beau Nouvelle
Beau Nouvelle

Reputation: 7252

This is how you can use those two functions to build a list of keys, and listen for when the list has completed being created.

func fetchLocations() {
    keys = [String]()

    let geoFire = GeoFire(firebaseRef: DataService().LOC_REF)
    let myLoc = CLLocation(latitude: 10.500000, longitude: -100.916664)
    let circleQuery = geoFire.queryAtLocation(myLoc, withRadius: 100.0)

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

    // Do something with list of keys.
    circleQuery.observeReadyWithBlock({
        print("All initial data has been loaded and events have been fired!")
        if keys.count > 0 {
            // Do something with stored fetched keys here.
            // I usually retrieve more information for a location from firebase here before populating my table/collectionviews.  
        }

    })
}

Upvotes: 4

Frank van Puffelen
Frank van Puffelen

Reputation: 598708

You'll want to wait for the query to report it is done. From the GeoFire documentation:

Sometimes you want to know when the data for all the initial keys has been loaded from the server and the corresponding events for those keys have been fired. For example, you may want to hide a loading animation after your data has fully loaded. GFQuery offers a method to listen for these ready events:

query.observeReadyWithBlock({
  println("All initial data has been loaded and events have been fired!")
})

Upvotes: 1

Related Questions