В Core Data, как получить весь объект NSSet?

#core-data #nspredicate #nsset #nsfetchedresultscontroller

#core-data #nspredicate #nsset #nsfetchedresultscontroller

Вопрос:

В настоящее время у меня есть следующая модель Core Data:

Категория

 @interface Category : NSManagedObject
@property (nonatomic, retain) NSSet *subcategory;
  

Подкатегория

 @interface SubCategory : NSManagedObject
@property (nonatomic, retain) Category *category;
@property (nonatomic, retain) NSSet *items;
  

Товары

 @interface Item : NSManagedObject
@property (nonatomic, retain) SubCategory *subCategory;
  

Я хочу получить все элементы в категории, однако, когда я пишу:

 NSLog(@"Items in Category:%@", self.category.subcategory.items)
  

Я ничего не получаю.

Каким будет способ извлечения информации? Поскольку я получаю класс со свойством, которое я добавил в ViewController:

 @property (strong, nonatomic) Category *category;
  

Ответ №1:

Одним из возможных решений является использование оператора сбора
@distinctUnionOfSets кодирования ключ-значение:

 NSSet *allItems = [self.category valueForKeyPath:@"subcategory.@distinctUnionOfSets.items"];
  

(Обратите внимание, что лучшим названием для отношения «подкатегория» для многих было бы
«подкатегории».)

В качестве альтернативы, вы можете выполнить запрос выборки для объекта «Item» с предикатом, используя обратные отношения:

 [NSPredicate predicateWithFormat:@"subCategory.category == %@", self.category];
  

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