4

尽管我已经工作了NSFetchedResultsController几十次,但我遇到了一个我似乎无法找到原因的问题。

我有一个管理表格视图的数据源的UIViewControllerwith 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);
        }
    }
}

即使将删除的对象插入到获取的结果控制器中,该对象也会变成故障,但我不明白为什么首先将它添加到获取的结果控制器中。

不会引发异常或错误。我已经执行了几次检查,例如调用isDeletedvalidateForDelete对对象查找原因,但我并没有变得更聪明。

编辑:

我很确定获取结果控制器的委托方法不是罪魁祸首,但为了完整起见,我添加了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;
        }
    }
}
4

0 回答 0