在批量更新删除时禁用 NSFetchedResultsController 生成的动画
Disable animations produced by NSFetchedResultsController on batch update deleting
我目前正在使用 NSFetchedResultsController 在 UITableView 实例中显示内容。
有时,我在 Core Data 中进行批量删除,然后进行批量插入。结果,NSFetchedResultsControllerDelegate 一个一个地进行插入和删除。这让 GUI 看起来很奇怪,您可以从字面上看到行被一行一行地删除或插入。
是否可以实现
NSFetchedResultsControllerDelegate 一次性清除或插入一批行,而不是迭代地进行?
- 将 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 在 UITableView 实例中显示内容。
有时,我在 Core Data 中进行批量删除,然后进行批量插入。结果,NSFetchedResultsControllerDelegate 一个一个地进行插入和删除。这让 GUI 看起来很奇怪,您可以从字面上看到行被一行一行地删除或插入。
是否可以实现 NSFetchedResultsControllerDelegate 一次性清除或插入一批行,而不是迭代地进行?
- 将 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
}