2015-09-28 35 views
0

我有一个tableView和一个segmentControlView它从数据库做不同的查询,但我无法得到表重新加载。如果我手动重新加载数据更改。Swift reloadTableView查询后表格

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

不可能得到你想要的东西。你想要什么后重新加载表? – adolfosrs

+0

段被选中后,我想要重新加载表。但我认为在queryForTable完成之前重新加载表 – PoolHallJunkie

+0

执行'PFQuery'异步工作。在返回数据后更新块中的表 – vadian

回答

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

PFQuery类型的值没有成员findObjectsInBackgroundWithCompletion – PoolHallJunkie

+0

对不起,内存必须有点模糊。它是'backgroundWithBlock'看到我的更新@PoolHallJunkie – Logan

+0

你是正确的,事实证明queryForTable不是异步的,所以findObjects里面不好。然而,即使现在表没有重新加载......我正在从cellForRowAtIndexPath访问PFObject。我没有本地存储的数据。 – PoolHallJunkie

0

对于这类工作,你应该使用query.findObjectsInBackground。它可能会要求在你的代码中进行一些重构,但会使你的应用程序响应得更快并且更易于用户使用。请点击这里video tutorial。它可能有帮助。

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

+0

。它链接到错误的视频 – adolfosrs

0

我的解决办法是错误的,原因有二。 首先queryForTable()不像Logan指出的那样是异步的。 findObjectsInBackgroundWithBlock必须在外面。

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

替代,修复:

self?.loadObjects