我有一个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',原因:'此查询具有出色的网络连接。你必须等到它完成。'
答案 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