NSFetchedResultsController делегирует методы, которые вызываются бесконечное число раз после insertNewObjectForEntityForName: inManagedObjectContext: - PullRequest
2 голосов
/ 24 марта 2012

[РЕДАКТИРОВАТЬ] Я изменяю это, чтобы более кратко объяснить, в чем заключалась моя проблема, после более точного определения проблемы.

Я работаю над основными данными для моего приложения, но я в тупике. Он висит в этом методе каждый раз. Ни сбоев, ни логов, ни ничего. Просто висит.

- (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 Ответ

8 голосов
/ 24 марта 2012

Хорошо, я понял это.Я создавал бесконечный цикл.

Этот метод делегата вызывается:

- (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: будет вызван еще раз, создавая цикл, который просто вращается.

...