Добавление пользовательских методов в подкласс NSManagedObject


У меня есть базовая модель данных, где у меня есть сущность A, которая является абстрактной. Сущности B, C и D наследуют от сущности A. существует несколько свойств, определенных в сущности A, которые используются B, C и D.

Я хотел бы использовать это наследование в своем модельном коде. В дополнение к свойствам, мне интересно, могу ли я добавить методы к сущности A, которые реализованы в ее суб-сущностях.

Например:

  1. я добавить метод в интерфейс для объекта, который возвращает значение и принимает один аргумент
  2. я добавляю реализации этого метода к A, B, C, D
  3. Затем я вызываю executeFetchRequest:, чтобы получить все экземпляры B
  4. я вызываю метод на извлеченных объектах, который должен вызвать реализацию метода, содержащегося в реализации B

Я пробовал это, но при вызове метода я получаю:

[имя метода NSManagedObject:]: непризнанной селектор послал экземпляр

Я предполагаю, что это потому что объекты, возвращаемые executeFetchRequest:, являются своего рода прокси-объектами.

Существует ли какой-либо способ использовать наследование с помощью подклассов NSManagedObjects?

Я действительно хотел бы иметь возможность сделать это, иначе мой код модели будет отвечать за определение типа NSManagedObject, с которым он имеет дело, и выполнять специальную логику в соответствии с типом, что нежелательно.

Любая помощь ценится, заранее спасибо.

4 13

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, как показано:

скриншот XCode modeler

Таким образом, CoreData автоматически присваивает правильный класс NSManagedObject, когда он извлекается из базы данных.

Если вы получаете это исключение, это означает, что основные данные не используют ваш пользовательский класс. Ключ здесь NSManagedObject - это данные ядра объекта, созданные для объектов в вашем хранилище данных.

Если вы этого еще не сделали, вам нужно будет создать класс, наследующий от NSManagedObject, добавить туда свои пользовательские методы, а затем задать entity A для использования вашего пользовательского класса в инструменте объектной модели. Если сущности B, C, D, и т.д. есть определенное поведение, вы должны создать подкласс класса, созданный для лицом A и присвоить эти структуры использовать подклассы.

По существу, у вас есть параллельная иерархия: одна иерархия сущностей, а другая-классов. Скорее всего, вы получите entity X и class X для каждой сущности в вашей объектной модели.

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