NSFetchedResultsController пытается ограничить количество отображаемых записей

При создании NSFetchRequest для перехода к моему NSFetchedResultsController я устанавливаю свойство fetchLimit равным 3.

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

То, что я ожидал, произойдет: вложенный объект подталкивает остальных вниз, а один падает снизу.

Что на самом деле происходит: вложенный объект подталкивает остальных вниз, а количество записей увеличивается до 4 ?!

Может ли кто-нибудь объяснить это, или как я должен справиться с этим?

One Solution collect form web for “NSFetchedResultsController пытается ограничить количество отображаемых записей”

Я немного поработал над этим, в основном проигнорировав numberOfObjects и вернув фактическую длину, я хочу, чтобы таблица была исправлена. Это требует немного обмана в controller:didChangeObject:... но, похоже, работает до сих пор.

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return kTableSize; //return [[[self.fetchedResultsController sections] objectAtIndex:section] numberOfObjects]; } - (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath { UITableView *tableView = self.myTableView; switch(type) { case NSFetchedResultsChangeInsert: // Only modify table if insert will effect visible rows if (newIndexPath.row < kTableSize) { // Delete last row to maintain fixed length [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:(kTableSize - 1) inSection:newIndexPath.section]] withRowAnimation:UITableViewRowAnimationAutomatic]; [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; } break; case NSFetchedResultsChangeDelete: // Only modify table if delete will effect visible rows if (indexPath.row < kTableSize) { [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; // Insert extra row to maintain fixed length [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:(kTableSize - 1) inSection:newIndexPath.section]] withRowAnimation:UITableViewRowAnimationAutomatic]; } break; case NSFetchedResultsChangeUpdate: // Only modify table if update will effect visible rows if (indexPath.row < kTableSize) { [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; } break; case NSFetchedResultsChangeMove: // Only modify table if move will effect visible rows if ((indexPath.row < kTableSize) || (newIndexPath.row < kTableSize)) { // Delete old row or last row of table if (indexPath.row < kTableSize) { [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; } else { [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:(kTableSize - 1) inSection:newIndexPath.section]] withRowAnimation:UITableViewRowAnimationAutomatic]; } // Insert new row or a row at bottom of table if (newIndexPath.row < kTableSize) { [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; } else { [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:(kTableSize - 1) inSection:newIndexPath.section]] withRowAnimation:UITableViewRowAnimationAutomatic]; } } break; } } 

Также необходимо позаботиться в tableView:cellForRowAtIndexPath: чтобы мы не пытались получить доступ к объекту, который не существует, если объектов меньше, чем длина таблицы.

  • Изменение NSFetchRequest, генерирующего индекс NSRangeException 0 за пределами для пустого массива
  • Я ошибся, когда получил данные из NSManagedObjectContext
  • NSExpressionDescription для пустых наборов результатов
  • Выполнение умножения (агрегации) с помощью CoreData: как?
  • Каков эффективный способ получения массива значений свойств из основного объекта данных?
  • Ошибка NSPredicate, executeFetchRequest
  • NSFetchRequest для вспомогательных объектов в строках
  • Основные данные NSFetchRequest возвращает несортированный массив после удаления объекта и повторной обработки данных
  • Отличительная выборка Core-data дает пустой массив
  • Как получить определенные записи в основных данных
  • iOS: естественный порядок сортировки
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.