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

Posted

技术标签:

【中文标题】在批量更新删除时禁用 NSFetchedResultsController 生成的动画【英文标题】:Disable animations produced by NSFetchedResultsController on batch update deleting 【发布时间】:2015-03-10 21:59:05 【问题描述】:

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

在某些时候,我会在 Core Data 中进行批量删除,然后进行批量插入。结果,NSFetchedResultsControllerDelegate 将插入和删除一一进行。这给 GUI 带来了一种奇怪的外观,您可以在其中看到行被逐一删除或插入。

是否可以实现 NSFetchedResultsControllerDelegate 一次清除或插入一批行,而不是反复执行?

【问题讨论】:

【参考方案1】:
    将 NSFetchedResultsController 的委托设置为 nil 进行批量更改 使 NSFetchedResultsController 重新获取其内容(即performFetch:) 将 NSFetchedResultsController 的委托设置回您的 viewController 重新加载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

【讨论】:

以上是关于在批量更新删除时禁用 NSFetchedResultsController 生成的动画的主要内容,如果未能解决你的问题,请参考以下文章

为批量删除操作禁用和启用或删除和创建非聚集索引

Spring boot集成Redis—进行增加,更新,查询,批量删除等操作

Mybatis批量更新,批量删除

jdbc-批量插入批量删除批量更新

在 WooCommerce 的结帐时禁用 AJAX

批量执行语句之——禁用所有表的外键