Добавление пользовательских методов в подкласс NSManagedObject - PullRequest
13 голосов
/ 28 января 2010

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

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

Например:

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

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

[NSManagedObject methodName:]: нераспознанный селектор отправлен на экземпляр

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

Есть ли способ использовать наследование, используя подклассы NSManagedObjects?

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

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

Ответы [ 4 ]

25 голосов
/ 28 января 2010

должно работать. Объекты, возвращаемые 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, как показано:

screenshot of XCode modeler

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

18 голосов
/ 28 января 2010

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

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

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

2 голосов
/ 06 июля 2012

После множества попыток решения isMemberOfClass на моем подклассе NSManagedObject, прежде чем пытаться использовать мой пользовательский метод, добился цели.

[thing isMemberOfClass:[Thing class]];
[thing customMethod]; //was getting unrecognized selector sent to instance here before
1 голос
/ 06 декабря 2011

У меня была та же самая ошибка по той же самой основной причине, но это произошло в другой ситуации и другом лечении. Ваше предложение мне очень помогло!

Первоначально я создал свой класс, реализуя мою запись вручную. Я не знал, что для этого есть меню Xcode. Я думаю, что ссылка никогда не была там! Так что только когда я добавил и начал тестировать новые пользовательские методы (не сеттеры / геттеры), я начал получать ошибку.

Мое решение состояло в том, чтобы изменить имя моего класса, заставить Xcode заново создать класс для моей записи через Editor->Create NS Mangage Object.... Затем вырезать и вставить старый код в новый класс. Нет разницы в коде!

Кажется, в Xcode есть какая-то внутренняя ссылка, которая не видна в коде.

...