Swift 在 queryForTable 之后重新加载 TableView

Swift reloadTableView after queryForTable

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

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', reason: '这个查询有一个未完成的网络连接。你必须等到它完成。'

对于这样的工作,您应该使用 query.findObjectsInBackground。它可能需要对您的代码进行一些重构,但会使您的应用响应速度更快、用户更友好。

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

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

仅仅进行查询是不够的,您必须在某处调用它:

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

我的解决方案是错误的有两个原因。 首先,queryForTable() 不是异步的,正如 Logan 指出的那样。 findObjectsInBackgroundWithBlock 必须在外面。

但是,PFQueryTableViewController 是一个解析 Class,其中 self.tableView.reloadData() 不起作用。

相反,修复:

self?.loadObjects