Обратные отношения сердечных данных не установлены

У меня есть две Entities, которые я назову A и B. Они настроены с отношениями To-Many в обоих направлениях, поэтому A.myBs и B.myAs являются NSSet.

Вот моя странная проблема.

Когда я добавляю B к моей сущности A, я делаю это, используя mutableSetValueForKey, как это:

NSMutableSet *myBSet = [myA mutableSetValueForKey:@"myBs"];
[myBSet addObject:theBtoAdd];

Это добавляет theBtoAdd к объекту A, но не добавляет обратную связь. Сохранение контекста Core Data не вызывает никаких ошибок, но мой объект A не имеет обратного B-набора. Если я выхожу из приложения, даже частичное соотношение не сохраняется.

Здесь странная часть... если я просто переключаю свой код и делаю наоборот (есть причины, по которым это сложнее сделать для моего конкретного приложения) - добавьте A в B вместо добавления B в следующим образом:

NSMutableSet *myASet = [myB mutableSetValueForKey:@"myAs"];
[myASet addObject:theAtoAdd];

Это прекрасно работает. Кстати, у меня есть много других ко многим отношениям, которые работают. Только этого нет.

Пара других вещей: 1) Моя основная модель объектов данных выглядит неплохо, но это первый новый объект, который я добавил в Xcode 4 2) Я проверил, перепроверялся и ослепнул, глядя на мои пользовательские NSManagedObjects, но они выглядят прекрасно объявленными динамическими, NSSet, не конфликтующими сеттерами/геттерами и т.д.

Приветствуются любые предложения по поддержке или отладке. Спасибо!

Ответ 1

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

Для меня ответ заключался в том, что в подклассе NSManagedObject у меня было чрезмерное:

- (void)willChangeValueForKey:(NSString *)inKey withSetMutation:(NSKeyValueSetMutationKind)inMutationKind usingObjects:(NSSet *)inObjects

- (void)didChangeValueForKey:(NSString *)inKey withSetMutation:(NSKeyValueSetMutationKind)inMutationKind usingObjects:(NSSet *)inObjects

Это предотвращает отправку правильных уведомлений родительскому классу (NSManagedObject), который обрабатывает автоматические обратные отношения.

Ответ 2

Я нашел ошибку, если вы переопределяете любой из этих методов

// KVO change notification
- (void)willChangeValueForKey:(NSString *)key;
- (void)didChangeValueForKey:(NSString *)key;
- (void)willChangeValueForKey:(NSString *)inKey withSetMutation:(NSKeyValueSetMutationKind)inMutationKind usingObjects:(NSSet *)inObjects;
- (void)didChangeValueForKey:(NSString *)inKey withSetMutation:(NSKeyValueSetMutationKind)inMutationKind usingObjects:(NSSet *)inObjects;

это приведет к тому, что NSManagedObject не будет работать хорошо, и отношения не будут установлены правильно.

Документация Apple: вы не должны переопределять эти методы.

Ответ 3

Если вы подклассифицируете управляемый объект, не должны ли быть методы сгенерированы автоматически для многих? Чтобы вам просто нужно было позвонить:

[aObject addBObject:bObject];