Добавление пользовательских методов в подкласс NSManagedObject
У меня есть базовая модель данных, где у меня есть сущность A, которая является абстрактной. Сущности B, C и D наследуют от сущности A. существует несколько свойств, определенных в сущности A, которые используются B, C и D.
Я хотел бы использовать это наследование в своем модельном коде. В дополнение к свойствам, мне интересно, могу ли я добавить методы к сущности A, которые реализованы в ее суб-сущностях.
Например:
- я добавить метод в интерфейс для объекта, который возвращает значение и принимает один аргумент
- я добавляю реализации этого метода к A, B, C, D
- Затем я вызываю
executeFetchRequest:
, чтобы получить все экземпляры B - я вызываю метод на извлеченных объектах, который должен вызвать реализацию метода, содержащегося в реализации B
Я пробовал это, но при вызове метода я получаю:
[имя метода NSManagedObject:]: непризнанной селектор послал экземпляр
Я предполагаю, что это потому что объекты, возвращаемые executeFetchRequest:
, являются своего рода прокси-объектами.
Существует ли какой-либо способ использовать наследование с помощью подклассов NSManagedObjects?
Я действительно хотел бы иметь возможность сделать это, иначе мой код модели будет отвечать за определение типа NSManagedObject, с которым он имеет дело, и выполнять специальную логику в соответствии с типом, что нежелательно.
Любая помощь ценится, заранее спасибо.
4 ответа:
Это должно сработать. Объекты, возвращаемые
executeFetchRequest:
, являются реальными экземплярамиNSManagedObject
s (или их подклассами.) Ниже приведены инструкции по использованию пользовательских классов в CoreData. Допустим, у вас есть сущности A и B, где B наследуется от A. Тогда вам нужны два пользовательских класса как@interface A:NSManagedObject{ } -(void)someMethod:(NSString*)a; @end; @interface B:A{ } -(void)someMethod:(NSString*)a; @end;
Затем установите их в Xcode data modeler, как показано:
Таким образом, CoreData автоматически присваивает правильный класс
NSManagedObject
, когда он извлекается из базы данных.
Если вы получаете это исключение, это означает, что основные данные не используют ваш пользовательский класс. Ключ здесь
NSManagedObject
- это данные ядра объекта, созданные для объектов в вашем хранилище данных.Если вы этого еще не сделали, вам нужно будет создать класс, наследующий от
По существу, у вас есть параллельная иерархия: одна иерархия сущностей, а другая-классов. Скорее всего, вы получите entityNSManagedObject
, добавить туда свои пользовательские методы, а затем задать entityA
для использования вашего пользовательского класса в инструменте объектной модели. Если сущностиB
,C
,D
, и т.д. есть определенное поведение, вы должны создать подкласс класса, созданный для лицомA
и присвоить эти структуры использовать подклассы.X
и classX
для каждой сущности в вашей объектной модели.
После того, как я попробовал множество решений, вызывающих isMemberOfClass на моем подклассе NSManagedObject, прежде чем попытаться использовать мой пользовательский метод, сделал трюк.
[thing isMemberOfClass:[Thing class]]; [thing customMethod]; //was getting unrecognized selector sent to instance here before
У меня была та же самая ошибка по той же самой основной причине, но она возникла в другой ситуации и в другом лечении. Ваше предложение мне очень помогло!
Первоначально я создал свой класс, реализующий мою запись вручную. Я не знал, что для этого есть меню Xcode. Я думаю, что связи никогда не было! Так что, пока я не добавил и не начал тестировать новые пользовательские методы (не setter/getters), я начал получать ошибку.
Мое решение состояло в том, чтобы изменить имя мой класс, пусть Xcode воссоздаст класс для моей записи через
Editor->Create NS Mangage Object....
, а затем вырезает и вставляет старый код в новый класс. Никакой разницы в коде!Xcode, похоже, имеет какую-то внутреннюю связь, которая не видна в коде.