即使我曾与NSFetchedResultsController
合作过几十次,但我遇到了一个我似乎无法找到原因的问题。
我有一个UIViewController
,其NSFetchedResultsController
管理表格视图的数据源。每当我删除NSFetchedResultsController
中的对象时,表视图都是由获取的结果控制器进行更新,但是当我保存NSManagedObjectContext
(提交删除)时,会触发对象的插入。刚刚删除。最终结果是该对象不会从表视图中删除。
奇怪的是,当应用程序重新启动时,应该删除的对象实际上已从商店中删除,并且不会显示在表视图中。
要清楚,我只使用一个托管对象上下文,只能在主线程上访问。换句话说,设置非常简单。
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
// Fetch Store
CCDStore *store = [self.fetchedResultsController objectAtIndexPath:indexPath];
// Delete Store
[self.fetchedResultsController.managedObjectContext deleteObject:store];
// Save Changes
NSError *error = nil;
[self.fetchedResultsController.managedObjectContext save:&error];
if (error) {
NSLog(@"Error %@ with user info %@.", error, error.userInfo);
}
}
}
即使删除的对象插入到获取的结果控制器中,该对象也会变成错误,但我不明白为什么它首先被添加到获取的结果控制器中。
不会抛出任何异常或错误。我已经执行了几项检查,例如在对象上调用isDeleted
和validateForDelete
来查找原因,但我没有变得更聪明。
编辑:
我很确定获取结果控制器的委托方法不是罪魁祸首,但为了完整性,我添加了controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:
的实现。
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {
[self updateView];
switch(type) {
case NSFetchedResultsChangeInsert: {
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
}
case NSFetchedResultsChangeDelete: {
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
}
case NSFetchedResultsChangeUpdate: {
[self configureCell:(CCDStoreCell *)[self.tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
break;
}
case NSFetchedResultsChangeMove: {
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]withRowAnimation:UITableViewRowAnimationFade];
break;
}
default: {
break;
}
}
}