我有一个实现 NSFetchedResultsControllerDelegate 的 UITableViewController。在
- (NSFetchedResultsController *)fetchedResultsController
我正在从实体加载记录。现在,当我更新该实体中的记录时,NSFetchedResultsChangeType 总是 NSFetchedResultsChangeDelete 并删除我的对象。我认为它应该只是更新,因为我正在更新记录而不是删除它。
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {
UITableView *tableView = self.tableView;
switch(type) {
case NSFetchedResultsChangeInsert:
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
NSLog(@"object deleted %d",
indexPath.row);
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeUpdate:
[self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
break;
case NSFetchedResultsChangeMove:
NSLog(@"object moved %d",
indexPath.row);
[tableView deleteRowsAtIndexPaths:[NSArray
arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[tableView insertRowsAtIndexPaths:[NSArray
arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
}}
编辑1:
当我第一次保存对象时,它似乎也没有插入。事实上,当时 didChangeObject 甚至没有被解雇。
编辑 2
更多信息:我对不同的谓词使用同一张表。我有一个拆分视图,左右视图都是表格视图。在左侧,我显示了一些类别,并根据左侧的选择配置右侧的视图。配置首先删除缓存,然后更改 NSFetchedResultsController 的谓词,然后对其执行 performFetch。在后台,我找到所选类别的更新对象,然后插入新对象或更新现有对象。现在添加新对象不会自动显示在表格视图中,并且更新对象会导致删除。我从不同的 NSFetchedResultsController 更新左表视图中的类别,效果很好。两个 NSFetchedResultsController 都使用不同的缓存文件。如果我不更改谓词,那么所有类别的对象都可以正常工作。