NSFetchedResultsController在insertNewObjectForEntityForName上调用无限次数的委托方法:inManagedObjectContext:

时间:2012-03-24 00:47:16

标签: database core-data save

[编辑]我正在改变这一点,以便更准确地解释我的问题,在更准确地指出问题之后。

我正在处理我的应用的核心数据,但我很难过。它每次都挂在这个方法中。没有崩溃,没有日志,没有任何东西。它只是挂起。

- (void)insertNewObject:(id)sender
{
    NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
    NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity];
    NSManagedObject *newObject = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];

    Section *newSection = (Section *)newObject;
    newSection.title = @"inserted";


    NSError *error = nil;

    if (![context save:&error]) {

        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }
}

NSManagedObject *newObject = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];

我发现如果我将NSLogs放在这两个委托方法中:

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller

他们只是被无数次召唤。

1 个答案:

答案 0 :(得分:8)

好的,我明白了。我正在创造一个无限循环。

调用此委托方法:

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller

然后这最终被调用因为我调用[self.tableView beginUpdates];在委托方法中。

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath

    {
        Section *object = [self.fetchedResultsController objectAtIndexPath:indexPath];
        object.title = [NSString stringWithFormat:@"Chapter %i", indexPath.row];
        cell.textLabel.text = object.title;

    }

然后这个委托方法:

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller

问题是我在更新内容时实际上是在更改NSManagedObject的属性

object.title = [NSString stringWithFormat:@"Chapter %i", indexPath.row];

这导致controllerWillChangeContent:再次被调用,创建一个循环的循环。