Цель-C: отношения «многие ко многим» с CoreData - PullRequest
4 голосов
/ 14 июля 2011

У меня есть приложения для iPhone с двумя моделями, категорией и контентом, которые имеют отношение многие ко многим.

Это код: Контент

@interface Content : NSManagedObject {
}

@property(readwrite, retain) NSString *type;
@property(readwrite, retain) NSString *mainText;
...
@property (copy) NSSet * categories;

@end

Категория

@interface Category : NSManagedObject {

}
@property (nonatomic, retain) NSNumber * id;
@property (nonatomic, retain) NSNumber * active;
...
@property (copy) NSSet * contents;

@end

И затем эта операция:

...
NSSet *tmp_set = [NSSet setWithArray:some_array_with_contents objectsAtIndexes:custom_indexes]];
cat.contents = tmp_set;
[[DataModel managedObjectContext] save:&error];
...

В последней строке приложение вылетает плохо, говоря:

-[__NSCFSet _isValidRelationshipDestination__]: unrecognized selector sent to instance 0x5c3bbc0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFSet _isValidRelationshipDestination__]: unrecognized selector sent to instance 0x5c3bbc0'

1 Ответ

3 голосов
/ 15 июля 2011

Ваши свойства отношений не должны использовать копию. Они должны сохранять, например:

@property (nonatomic, retain) NSSet* categories;

Вы не хотите копировать набор управляемых объектов, поскольку в графе объектов вы получите дубликаты объектов. Это вызовет большие проблемы.

Однако это не является непосредственной проблемой. Непосредственная проблема заключается в том, что что-то заставляет селектор, предназначенный для управляемого объекта, отправляться в сам набор.

Скорее всего, это вызвано непосредственным присвоением скопированного набора взаимосвязи, а не использованием одного из методов доступа, определенных в файле .m. Директива @dynamic не создаст метод setCategories, потому что это управляемый объект, поэтому вы не получаете надлежащие уведомления KVO и контекст не обновляется должным образом. Когда он пытается сохранить, он отправляет проверочные сообщения заданному объекту вместо содержащихся в нем объектов.

В файле реализации должен быть метод, подобный addCategoryObjects:. Удаление копии и использование этих методов должно решить проблему.

...