NSFetchedResultsController и наследование сущностей


У меня есть родительская сущность в событии моей модели. И две детские сущности: День Рождения, Юбилей. Я использую функцию наследования сущностей, встроенную в основные данные, так что родительский объект birthday и anniversary является событием.

Поэтому я делаю выборку, используя следующее:

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

// Set the batch size to a suitable number.
[fetchRequest setFetchBatchSize:20];

// Edit the sort key as appropriate.
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"start_date" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil];

etc...

Теперь я хочу отсортировать fetchedObjects по типу события, дню рождения или годовщине.

Как мне это сделать? Я попробовал:

for (Birthday *birthday in _fetchedResultsController.fetchedObjects){
    [birthdayObjects addObject:birthday]; 
}
for (Anniversary *anniversary in _fetchedResultsController.fetchedObjects){
    [anniversaryObjects addObject:anniversary]; 
}

Но это просто добавляет все объекты в fetchedObjects к каждому массиву.

Есть идеи или я иду по этому неверному пути?

Обновление :

Понял это, используя следующее:

for (Event *event in _fetchedResultsController.fetchedObjects){
    if ([event isKindOfClass:[Birthday class]]){
        [birthdayObjects addObject:event]; 
    }else{
        [anniversary addObject:event];
    }
}
Но если есть лучший путь, я готов к нему! Спасибо.
1 4

1 ответ:

Имеют свойство только для чтения на Event, называемое eventType или подобное, которое возвращает строку. Класс событий возвращает одну строку, а дочерние события-День рождения, годовщину и все остальное для будущих типов событий.

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

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

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