Как фильтровать результаты из 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 против NSCompoundPredicate?
  • NSPredicate для фильтрации Получение результатов
  • Как создать предикат, который сравнивает все свойства объекта?
  • Фильтр NSPredicate to-Many с дочерним объектом
  • NSPredicate с несколькими условиями
  • Каков наилучший способ создания сложного NSCompoundPredicate?
  • Используйте NSPredicate для извлечения информации из основных данных из отношения
  • Предикат NSPredicateWithFormat, передающий имя атрибута
  • Основные данные Трансформируемые атрибуты НЕ работают с NSPredicate
  • NSPredicate для проверки количества мобильных телефонов
  • Как получить запись всех контактов в iOS 9 с помощью приложения «Контакты»
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.