这是我所有的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的调用。如果您未在此块内进行插入,删除和选择调用,则表属性(例如行数)可能变得无效。

08-07 08:13