我对核心数据的常规使用模式非常熟悉,但最近偶然发现了一个问题:想象一个简单的案例,我有一个人的实体,有2个字符串属性名称和公司。我想按名称对UITableView进行排序,并按公司名称划分为多个部分。听起来很简单:
...
personFetchController_ = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:mainDataCenter.managedObjectContext
sectionNameKeyPath:@"company"
cacheName:@"PersonListCache"];
NSError *error = nil;
if (![personFetchController_ performFetch:&error])
{
LogError(@"Error fetching persons: %@", [error localizedDescription]);
}
personFetchController_.delegate = self;
我注册为委托来听取更改,尤其是对部分的更改:
- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type
{
NSIndexSet *sections = [NSIndexSet indexSetWithIndex:sectionIndex];
switch (type)
{
case NSFetchedResultsChangeInsert:
[personTableView_ insertSections:sections withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[personTableView_ deleteSections:sections withRowAnimation:UITableViewRowAnimationFade];
default:
break;
}
}
当我添加/删除/更改某个人的姓名时,它非常有用,但如果我更改了某个人的公司名称(这意味着从一个部分移动)对于另一个),应用程序崩溃,在插入后说,该部分中的行数需要是旧值加一。
任何人都能正常工作吗?
答案 0 :(得分:0)
导致此崩溃的代码很可能不在此方法中。
请发布此方法的代码:
-(void)controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:
尤其如何使用NSFetchedResultsChangeMove类型来响应更改?
在NSFetchedResultsControllerDelegate的Apple-Documentation中,他们将它用于didChangeObject:...
case NSFetchedResultsChangeMove:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationFade];
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]
withRowAnimation:UITableViewRowAnimationFade];
break;
在我发现Apple-Documentation几乎包含NSFetchedResultsController所需的所有代码之前,我使用了一些来自网络的代码,我想从一些教程中可以看出,它在罕见的情况下导致了崩溃。经过一段时间后,我发现我可以在第一部分(将被删除)中的唯一对象移动到第二部分(这将是新的第一部分)时触发此操作。
从那时起,我在阅读教程^^
之前先阅读并搜索Apple-Documentation