Search code examples
swiftuitableviewpfquery

Swift reloadTableView after queryForTable


I have a tableView and a segmentControlView which does a different query from the database but I can't get the table to reload. If I manually reload the data changes.

override func queryForTable() -> PFQuery {
        var query:PFQuery = PFQuery(className:"movies")

    if(objects?.count == 0)
    {
        query.cachePolicy = PFCachePolicy.CacheThenNetwork
    }
     if self.currentSegmentSelected == 0 {
        query.whereKey("genres", equalTo:"Action")
        query.orderByAscending("title")
     }
    else if currentSegmentSelected == 1 {
        query.whereKey("genres", equalTo:"Comedy")
        query.orderByAscending("title")
     }
    else if currentSegmentSelected == 2 {
        query.whereKey("genres", equalTo:"Crime")
        query.orderByAscending("title")
     }
    return query
}

And the delegate method of the SegmentControl

func segmentView(segmentView: SMSegmentView, didSelectSegmentAtIndex index: Int) {
        self.currentSegmentSelected = index
        queryForTable()
        self.tableView.reloadData()
    }

EDITED : If I used .findObjectsInThebackground like this :

 override func queryForTable() -> PFQuery {
        var query:PFQuery = PFQuery(className:"movies")
        query.findObjectsInBackgroundWithBlock { (_: [PFObject]?, error:NSError?) -> Void in
             if error == nil {

                self.tableView.reloadData()

            }}

'NSInternalInconsistencyException', reason: 'This query has an outstanding network connection. You have to wait until it's done.'


Solution

  • It's not enough to just make your query, you'll have to call it somewhere:

    func segmentView(segmentView: SMSegmentView, didSelectSegmentAtIndex index: Int) {
        self.currentSegmentSelected = index
        queryForTable().findObjectsInBackgroundWithBlock { [weak self] objects, error in
            if error == nil {
                // Do whatever with `objects` and set it to your data source, whatever you named it.
                self?.yourDataSourceArray = objects
                self?.tableView.reloadData()
            }   
        }
    }