Search code examples
parse-platformgeolocationswift2pfquerygeopoints

'queryForTable' cannot return 'nil' In Swift


I am using PFQueryTableViewController as part of ParseUI to load a table of objects based on the currentUser's geolocation. I have seen several other (older) forum posts (like here) detailing that the queryForTable function should return nil if a value like currentLocation:PFGeoPoint? is nil. Then wait on the background process in viewDidLoad to get the PFGeoPoint and loadObjects(), thus calling the queryForTable function again.

I am seeing others say that Swift's ParseUI libraries may not have a queryForTable function that allows nil returns.

var currentLocation:PFGeoPoint? = nil

override func viewDidLoad() {
    if currentLocation == nil {
        PFGeoPoint.geoPointForCurrentLocationInBackground {
            (geoPoint: PFGeoPoint?, error: NSError?) -> Void in
            if error == nil {
                print("Got the user's current location!")
                self.currentLocation = geoPoint
                print("Reloading table using user's location")
                self.loadObjects()
            }
        }
    }
}

override func queryForTable() -> PFQuery {

    if self.currentLocation != nil {
        print("Generating query based on user's location!")
        let query = PFQuery(className:self.parseClassName!)
        query.whereKey("taskLocation", nearGeoPoint: self.currentLocation!, withinMiles: 50)

        if(self.objects?.count == 0)
        {
            query.cachePolicy = PFCachePolicy.CacheThenNetwork
        }

        return query
    }

    print("User's current location is not known")
    return nil
}

Obviously, this fails to build because the function is not (note the question mark):

override func queryForTable() -> PFQuery? {
...
}

My attempted workaround was to return PFQuery() instead of nil, but I believe it returns after the viewDidLoad self.loadObjects(). The behavior I see is a momentary flash of a table with cell results, and then an empty table.

Here is a link to the Google Group discussion about this very issue, with Hector Ramos saying that it works with Objective-C but not Swift (...yet?). I'm running the latest ParseUI as of this posting (1.1.6).

Is there an option yet to do this in Swift? If not, when?

If this isn't an option, what are some workarounds people have tried successfully?


Solution

  • I actually figured this issue out - nothing to do with the code itself. Apparently, when you set a fake location on the iOS Simulator, it also enforces that different location when you use a real iOS device plugged in. My results were not showing up because there legitimately wasn't an object with a PFGeoPoint near my location (because it thought I was in London!)

    Anyway, moral of the story is to make sure you always know your preset location in both Simulator and physical iOS devices.

    PS - The code above does work when my location is set correctly.