Как фильтровать результаты из NSFetchedResultsController на основе рассчитанного свойства?

У меня есть NSManagedObject именем WorkOrder с логическим свойством isComplete определенным в категории для этого класса.

Я использую NSFetchedResultsController для извлечения из хранилища данных и отображения их в виде таблицы. Я хотел бы иметь возможность фильтровать результаты на isComplete свойства isComplete , но, конечно, предикат NSFetchedResultsController не может этого сделать, потому что свойство не является атрибутом Core Data. Я также не могу отфильтровать массив fetchedObjects контроллера, потому что это свойство fetchedObjects только для чтения.

Есть ли способ сделать то, что я пытаюсь сделать, не сворачивая мою собственную структуру данных, которая имитирует NSFetchedResultsController но позволяет мне фильтровать результаты после извлечения?

2 Solutions collect form web for “Как фильтровать результаты из NSFetchedResultsController на основе рассчитанного свойства?”

Как я уже сказал в комментариях к ответу Адама Эбербаха, я решил это, используя NSDictionary ( self.workOrdersByDate , ниже) для хранения сгруппированных результатов, а также NSArray ( self.dateSections , ниже) для хранения отсортированных ключей словаря ,

 // Fetch all the WorkOrders NSArray *results = [WorkOrder findAll]; // Filter based on isComplete property NSPredicate *filter; if (self.segmentedStatus.selectedSegmentIndex == SegmentAssigned) { filter = [NSPredicate predicateWithFormat:@"isComplete == 0"]; } else { filter = [NSPredicate predicateWithFormat:@"isComplete == 1"]; } results = [results filteredArrayUsingPredicate:filter]; // Retain an NSArray of sorted NSDate keys self.dateSections = [[results valueForKeyPath:@"@distinctUnionOfObjects.scheduledStartDate.beginningOfDay"] sortedArrayUsingSelector:@selector(compare:)]; // Create the dictionary self.workOrdersByDate = [[NSMutableDictionary alloc] initWithCapacity:self.dateSections.count]; for (int sectionNum = 0; sectionNum < self.dateSections.count; sectionNum++) { NSPredicate *sectionPredicate = [NSPredicate predicateWithFormat:@"scheduledStartDate.beginningOfDay == %@", [self.dateSections objectAtIndex:sectionNum]]; NSArray *workOrdersForSection = [results filteredArrayUsingPredicate:sectionPredicate]; [resultsDict setObject:workOrdersForSection forKey:[self.dateSections objectAtIndex:sectionNum]]; } 

Вы получаете массив объектов из запроса Core Data, почему бы не использовать filteredArrayUsingPredicate для этого результата, чтобы получить массив, который вы действительно хотите?

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

  • NSPredicate для проверки NULL и пустых строк
  • Форматирование NSPredicate: соответствие «ANY», которое соответствует двум условиям
  • нечувствительный к регистру NSPredicate с единственным результатом в CoreData
  • NSPredicate для массива словарей
  • Предикат Core Data падает, когда атрибут nil
  • Несколько NSPredicate
  • Как создать предикат, который сравнивает все свойства объекта?
  • Предикат CoreData: длина свойства строки?
  • Как я могу использовать NSPredicate для выбора точной фразы из массива?
  • NSPredicate для диапазона между двумя датами работает не так, как ожидалось
  • Использование NSDate в NSPredicate
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.