在批量更新删除时禁用 NSFetchedResultsController 生成的动画

Disable animations produced by NSFetchedResultsController on batch update deleting

我目前正在使用 NSFetchedResultsController 在 UITableView 实例中显示内容。

有时,我在 Core Data 中进行批量删除,然后进行批量插入。结果,NSFetchedResultsControllerDelegate 一个一个地进行插入和删除。这让 GUI 看起来很奇怪,您可以从字面上看到行被一行一行地删除或插入。

是否可以实现 NSFetchedResultsControllerDelegate 一次性清除或插入一批行,而不是迭代地进行?

  1. 将 NSFetchedResultsController 的委托设置为 nil
  2. 进行批量更改
  3. 使 NSFetchedResultsController 重新获取其内容(即 performFetch:
  4. 将 NSFetchedResultsController 的委托设置回您的 viewController
  5. 重新加载 tableView

我对我的 NSFetchedResultsController 使用通常的惰性 getter 方法,所以我可以将它的实例变量设置为 nil,tableView 重新加载将创建一个新的。

例如:

// returns a NSFetchedResultsController that has performed its fetch
- (NSFetchedResultsController *)fetchedResultsController {
    if (_fetchedResultsController) {
        return _fetchedResultsController;
    }
    _fetchedResultsController = [NSFetchedResultsController alloc] initWith...
    if (![_fetchedResultsController performFetch:&error]) {
        ...
    }
    _fetchedResultsController.delegate = self;
    return _fetchedResultsController;
}

- (void)batchRequestWithoutAnimation {
    _fetchedResultsController.delegate = nil;
    // mass insert/delete
    _fetchedResultsController = nil;
    [self.tableView reloadData]; // tableView dataSource methods call 
                                 // [self fetchedResultsController], 
                                 // which will create a new one
}