在queryForTable之后的Swift reloadTableView

时间:2015-09-28 13:54:33

标签: swift uitableview pfquery

我有一个tableView和一个segmentControlView,它从数据库执行不同的查询,但我无法让表重新加载。如果我手动重新加载数据更改。

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
}

SegmentControl的委托方法

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

已编辑: 如果我像这样使用.findObjectsInThebackground:

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

                self.tableView.reloadData()

            }}

'NSInternalInconsistencyException',原因:'此查询具有出色的网络连接。你必须等到它完成。'

3 个答案:

答案 0 :(得分:1)

仅仅提出您的查询还不够,您必须在某个地方调用它:

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()
        }   
    }
}

答案 1 :(得分:0)

对于这样的工作,您应该使用query.findObjectsInBackground。它可能会在您的代码中要求进行一些重构,但会使您的应用程序更具响应性和用户友好性。

看看这个video tutorial。这可能有所帮助。

来自this question的代码应该更有帮助。

答案 2 :(得分:0)

我的解决方案错了两个原因。 首先,queryForTable()不是异步,因此Logan指出。 findObjectsInBackgroundWithBlock必须在外面。

但是,PFQueryTableViewController是一个Parse Class,其中self.tableView.reloadData()无效。

相反,修复:

self?.loadObjects