Добавление настраиваемых методов к подклассу 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, похоже, имеет некоторую внутреннюю ссылку, которая не является очевидной в коде.