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