Скажем, у меня есть два объекта: Статьи и Категории со много-многими отношения между двумя. Ради этого примера все соответствующие категории были уже добавлены к хранилищу данных. Когда цикличное выполнение через данные, которые содержат редактирования для статей, существует информация отношений категории, которая должна быть сохранена.
Я был планированием использования -setValue
метод в Article
класс для установки отношений как так:
- (void)setValue:(id)value forUndefinedKey:(NSString *)key {
if([key isEqualToString:@"categories"]){
NSLog(@"trying to set categories...");
}
}
Проблема - это value
не a Category
, это - просто строка (или массив строк) исполнение обязанностей категории. Я мог, конечно, сделать поиск в рамках этого метода для каждой категории и присвоить его, но это кажется неэффективным при обработке целого набора статей сразу. Другая опция состоит в том, чтобы заполнить массив всех возможных категорий и просто отфильтровать, но мой вопрос состоит в том, где сохранить тот массив? Если это - метод класса для Article
? Есть ли способ передать в дополнительных данных -setValue
метод? Есть ли другой, более оптимальный вариант для установки отношений, о которых я не думаю?
Спасибо за помощь.
Почему вы реализуете setValue: forKey :? У вас должна быть связь между этими двумя объектами, которая устанавливается как «многие ко многим» и работает напрямую с отношениями. Здесь похоже, что вы делаете это на собственном горьком опыте.
Какова ваша конечная цель с этим кодом?
Если я правильно вас понял, у вас есть большой двоичный объект данных JSON, и вы хотите превратить его в граф объектов, и он правильно соответствует этому графу объектов? Если да, посмотрите, пожалуйста, на код, который я написал в этом другом ответе:
JSON и основные данные на iPhone
В этом ответе я покажу, как рекурсивно создавать и деконструировать граф NSManagedObject в структуру JSON и из нее. Это немного проще, чем путь, по которому вы идете прямо сейчас.
Похоже, у вас определено отношение 1: 1, поэтому вы пытаетесь сказать, что статья принадлежит одной и только одной категории.
Когда вы заполняете один объект, вам может понадобиться создать другой; поэтому при создании статьи вам нужно будет проверить свое основное хранилище данных на предмет объекта правильного типа, и если он не существует, вы создаете его. Когда у вас есть объект, существующий ранее или только что созданный, вы либо назначаете (отношение одного) его отношению ivar Category *, либо (отношение многих) добавляете его в NSSet *, выражая отношение.
Итак, да, вам действительно нужно найти и назначить фактический объект, поскольку вы должны создать отношение к объекту в контексте управляемого объекта, и если оно не существует, оно должно быть создано до того, как это отношение может быть установлено.