在批量更新删除时禁用 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 生成的动画的主要内容,如果未能解决你的问题,请参考以下文章