Осторожно!
Базовые данные не легковесны. Это потребует большого количества изменений в том, как работают ваши объекты, если они не очень простые.
1) Существуют ли какие-либо функции NSManagedObject, которые не позволили бы мне обрабатывать экземпляры пользовательских классов так же, как и в NSObject?
Неисправности и жизненный цикл управляемых объектов немного сложны для понимания. Ваши объекты могут быть «повреждены» почти в любое время (в любом случае, на каждой итерации цикла событий), что приводит к потере непостоянного состояния. Когда они становятся «неповрежденными», они не имеют доступа ни к чему вне контекста управляемого объекта, чтобы восстановить свое состояние. Управляемым объектам очень трудно получить доступ к чему-либо вне контекста управляемого объекта.
Переходные свойства возможны, но в значительной степени ограничены вещами, которые могут быть вычислены из постоянных свойств, поскольку их состояние будет потеряно, если объект когда-либо будет поврежден. Вы также должны официально объявить, что вы используете временное свойство в модели данных. Попытка просто установить переменные экземпляра приведет к проблемам.
Таким образом, в основном свойства управляемых объектов должны быть постоянными или связанными с постоянными свойствами. Посмотрите на объекты, которые вы планируете сделать управляемыми. Являются ли все их переменные экземпляра выполнимыми и желательными для хранения в постоянном хранилище? Если не все будет не так просто. Вы, вероятно, установили переменные вашего экземпляра в вашем init. Нет инициализации, которая вызывается каждый раз, когда ваша программа запускается для управляемых объектов. Есть awakeFromInsert и awakeFromFetch, но они не работают точно так же, как init. Ваш код вызывает init и может передавать аргументы. Фреймворк вызывает awake и не получает параметров.
Потоки - это еще одна проблема для рассмотрения. Контекст управляемого объекта и, следовательно, управляемые объекты в нем рекомендуется использовать только одному потоку. Если у вас есть несколько потоков, и им нужен доступ к вашей модели, вам необходимо создать дублированные контексты управляемых объектов, содержащие дубликаты ваших управляемых объектов. Базовые данные разработаны для того, чтобы справляться с этим без чрезмерной нагрузки на память, дисковый ввод-вывод и процессор, но они не легки с точки зрения кодирования.
2) Есть ли у NSManagedObject необычное поведение при обработке объектов БЕЗ наличия ManagedObjectContext?
Вы не можете иметь управляемый объект без контекста управляемого объекта.
Обычно это не проблема. Управляемые объекты содержат указатель на их контекст управляемого объекта. Это может быть немного ограничивающим, хотя. Если что-то за пределами вашей модели требует создания объекта модели в качестве входных данных для вашей модели, для этого ему необходим доступ к контексту управляемого объекта. Надеюсь, что это будет через какой-то уровень абстракции, поэтому ему не нужно знать, что он имеет дело с Core Data, но вы не можете просто дать ему класс и получить его alloc / init. Также необходимо проделать небольшую работу по перемещению управляемых объектов между различными контекстами управляемых объектов.
3) Могу ли я заменить объявление свойства @dynamic своим собственным геттером / сеттером без особых проблем? Я использую множество пользовательских сеттеров для реализации бизнес-логики.
Да. Это немного сложно, но выполнимо. Вы пишете свои собственные средства доступа. В дополнение к вашей бизнес-логике они должны вызывать методы наблюдения значения ключа, такие как willChangeValueForKey:
. Затем вы получаете доступ к данным, используя примитивные методы доступа.