Добавление пользовательских методов в подкласс NSManagedObject
У меня есть базовая модель данных, где у меня есть сущность A, которая является абстрактной. Сущности B, C и D наследуют от сущности A. существует несколько свойств, определенных в сущности A, которые используются B, C и D.
Я хотел бы использовать это наследование в своем модельном коде. В дополнение к свойствам, мне интересно, могу ли я добавить методы к сущности A, которые реализованы в ее суб-сущностях.
Например:
- я добавить метод в интерфейс для объекта, который возвращает значение и принимает один аргумент
- я добавляю реализации этого метода к A, B, C, D
- Затем я вызываю
executeFetchRequest:, чтобы получить все экземпляры B - я вызываю метод на извлеченных объектах, который должен вызвать реализацию метода, содержащегося в реализации B
Я пробовал это, но при вызове метода я получаю:
[имя метода NSManagedObject:]: непризнанной селектор послал экземпляр
Я предполагаю, что это потому что объекты, возвращаемые executeFetchRequest:, являются своего рода прокси-объектами.
Существует ли какой-либо способ использовать наследование с помощью подклассов NSManagedObjects?
Я действительно хотел бы иметь возможность сделать это, иначе мой код модели будет отвечать за определение типа NSManagedObject, с которым он имеет дело, и выполнять специальную логику в соответствии с типом, что нежелательно.
Любая помощь ценится, заранее спасибо.
4 ответа:
Это должно сработать. Объекты, возвращаемые
executeFetchRequest:, являются реальными экземплярамиNSManagedObjects (или их подклассами.) Ниже приведены инструкции по использованию пользовательских классов в 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, похоже, имеет какую-то внутреннюю связь, которая не видна в коде.
