UITableView не обновляет DataSource после изменения на NSFetchedResultsController - PullRequest
5 голосов
/ 16 июля 2010

У меня есть UITableView, заполненный NSFetchedResultsController.Начальная загрузка работает нормально.Я могу добавлять, удалять, изменять и т. Д. С нулевыми проблемами. Но я хочу добавить пользовательскую сортировку в таблицу.Я делаю это, меняя NSFetchedResultsController на другой набор sortDescriptor и другой sectionNameKeyPath.Вот код, где я меняю выборку:

-(void)changeFetchData {
    fetchedResultsController = nil;

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Object" inManagedObjectContext:managedObjectContext];
    [fetchRequest setEntity:entity];

    NSString *sortKey = @"sortKey";
    NSString *cacheName = @"myNewCache";
    BOOL ascending = YES;

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:sortKey ascending:ascending];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
    [fetchRequest setSortDescriptors:sortDescriptors];

    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:sortKey cacheName:nil];
    self.fetchedResultsController = aFetchedResultsController;
    fetchedResultsController.delegate = self;

    [aFetchedResultsController release];
    [fetchRequest release];
    [sortDescriptor release];
    [sortDescriptors release];

    NSError *error;
    if (![[self fetchedResultsController] performFetch:&error]) {
        // Update to handle the error appropriately.
        NSLog(@"Fetch failed");
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        exit(-1);  // Fail
    }

    [self.tableView reloadData];
}

Когда я вызываю этот метод, он прекрасно работает.Таблица немедленно переупорядочивает себя, чтобы использовать новую информацию о разделе и новые параметры сортировки.Но если я добавляю или удаляю элементы к данным, TableView не обновляет свою информацию, вызывая сбой.Я могу NSLog подсчитать общее количество объектов в fetchedResultsController и увидеть, как он увеличивается (и уменьшается), но если я NSLog возвращаю значения для numberOfRowsInSection для отслеживания изменений, метод вызывается, но значения don 'т изменить.Получают следующий сбой (для добавления, но удаление аналогично)

Неверное обновление: недопустимое количество строк в разделе 2. Количество строк, содержащихся в существующем разделе после обновления (3), должно бытьравно количеству строк, содержащихся в этом разделе до обновления (3), плюс или минус количество строк, вставленных или удаленных из этого раздела (1 добавлено, 0 удалено).with userInfo (null)

Если я перезапущу приложение, я вижу добавленный элемент или не вижу удаленный элемент, поэтому я правильно изменяю источник данных.

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 16 июля 2010

Возможно, старый контроллер все еще жив. Если это так, он все еще может вызывать контроллер табличного представления в качестве своего делегата и активировать обновление таблицы, используя свои собственные данные.

Я бы предложил зарегистрировать выбранный объект контроллера результатов в numberOfRowsInSection, чтобы подтвердить, что он использует новый контроллер. Вы должны установить делегата старого контроллера на ноль, прежде чем назначать новый.

0 голосов
/ 05 сентября 2013

В одном случае добавление:

- (void)viewDidDisappear:(BOOL)animated
{     
 self.fetchedResultsController.delegate = nil;
}

Устранена аналогичная проблема, возникающая при изменении количества строк, но сохраняемые данные остаются другими и не актуальными.

...