如何正确实现NSFetchedResultsController.controllerDidChange()

时间:2015-03-22 04:28:57

标签: swift core-data nsfetchedresultscontroller

我有一个UIView,其中包含UITableView以及不同的组件。其对应的UIViewController的{​​{1}}如下:

viewDidLoad()

这种安排很好:当我在表格中添加/删除条目时,表格会重新加载。

但我不认为这是正确的做法,因为每当发生任何变化时整个表都会重新加载。看起来有点矫枉过正。

在网上看了好几个小时之后,我什么都没有。任何人都可以指出我这样做的正确方法吗?或者我做得对吗?

1 个答案:

答案 0 :(得分:1)

虽然没有什么"错误"如你所述,每次有一个对象改变时,都不需要reloadData()来调用它。您可以通过实施其他NSFetchedResultsControllerDelegate功能并使用beginUpdates()endUpdates()来更新您想要的内容,如下所示:

func controllerWillChangeContent(controller: NSFetchedResultsController) {
    tableView.beginUpdates()
}

func controllerDidChangeContent(controller: NSFetchedResultsController) {
    tableView.endUpdates()
}


func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) {

    switch type {
    case NSFetchedResultsChangeType.Insert:
        tableView.insertRowsAtIndexPaths([newIndexPath!], withRowAnimation: .Fade)
    case NSFetchedResultsChangeType.Delete:
        tableView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: .Fade)
    case NSFetchedResultsChangeType.Move:
        break
    case NSFetchedResultsChangeType.Update:
        tableView.reloadRowsAtIndexPaths([indexPath!], withRowAnimation: .Fade)
    }
}