尽管我已经工作了NSFetchedResultsController
几十次,但我遇到了一个我似乎无法找到原因的问题。
我有一个管理表格视图的数据源的UIViewController
with a 。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;
}
}
}