这是我所有的NSFetchedResultsControllerDelegate
:
//MARK: - NSFetchedResultsControllerDelegate
func controllerWillChangeContent(controller: NSFetchedResultsController) {
self.tableView.beginUpdates()
}
func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) {
switch type {
case .Insert:
if let newIndexPath = newIndexPath {
tableView.insertRowsAtIndexPaths([reversedIndexPathForIndexPath(newIndexPath)], withRowAnimation: .Fade)
}
case .Delete:
if let indexPath = indexPath {
tableView.deleteRowsAtIndexPaths([reversedIndexPathForIndexPath(indexPath)], withRowAnimation: .Fade)
}
case .Update:
if let indexPath = indexPath {
if let cell = tableView.cellForRowAtIndexPath(reversedIndexPathForIndexPath(indexPath)) as? WLCommentTableViewCell {
updateCell(cell, withIndexPath: indexPath)
}
}
case .Move:
if let indexPath = indexPath, let newIndexPath = newIndexPath {
tableView.deleteRowsAtIndexPaths([reversedIndexPathForIndexPath(indexPath)], withRowAnimation: .Fade)
tableView.insertRowsAtIndexPaths([reversedIndexPathForIndexPath(newIndexPath)], withRowAnimation: .Fade)
}
}
}
func controllerDidChangeContent(controller: NSFetchedResultsController) {
tableView.endUpdates() //Thread 1: EXC_BAD_ACCESS (code=1, address=0x20)
updateView()
if shouldScrollTableToBottom {
scrollTableViewToBottom()
}
}
有时我的应用程序在与
tableView.endUpdates()
一起崩溃。为什么? 最佳答案
线
tableView.endUpdates() //Thread 1: EXC_BAD_ACCESS (code=1, address=0x20)
应该进入NSFetchresultsController委托方法,该方法将通知您所有更改已完成:
controllerDidChangeContent:通知接收者获取的结果控制器已完成对一个或多个更改的处理
添加,删除,移动或更新。
func controllerDidChangeContent(controller: NSFetchedResultsController) {
updateView()
if shouldScrollTableToBottom {
scrollTableViewToBottom()
}
tableView.endUpdates() // Mark here no more updates to the tableview
}
endUpdates:包含一系列方法调用,这些方法调用可插入,删除,选择或重新加载表视图的行和节。
您调用此方法可以括入一系列以beginUpdates开头的方法调用,这些方法调用包括用于插入,删除,选择和重新加载表视图的行和部分的操作。调用endUpdates时,UITableView会同时对操作进行动画处理。可以嵌套beginUpdates和endUpdates的调用。如果您未在此块内进行插入,删除和选择调用,则表属性(例如行数)可能变得无效。