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
我有一个 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