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

时间:2015-03-10 21:59:05

标签: ios animation nsfetchedresultscontroller

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

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

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

1 个答案:

答案 0 :(得分:5)

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

  6. 我对NSFetchedResultsController使用通常的lazy getter方法,所以我可以将其实例变量设置为nil,tableView reload将创建一个新的。

    e.g:

    // 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
    }