NSFetchedResultsController中的删除在重新启动后才会保留

时间:2013-05-06 15:11:36

标签: ios core-data nsfetchedresultscontroller

即使我曾与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);
        }
    }
}

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

不会抛出任何异常或错误。我已经执行了几项检查,例如在对象上调用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;
        }
    }
}

0 个答案:

没有答案