Почему именно один подкласс NSManagedObject? - PullRequest
14 голосов
/ 31 октября 2011

Я прочитал много SO вопросов о NSManagedObject, Apple docs и т. Д., Но я до сих пор не понимаю, для чего предназначен подкласс NSManagedObject - какую роль он играет?

В документах Apple говорится о том, что я не могу переопределить кучу методов, не должен использовать пользовательские переменные экземпляра, бла и бла (некоторые я пока не понимаю) и так далее - ну и что я могу сделать с NSManagedObject? Каковы ограничения, правила, которые необходимо соблюдать, а какие нет?

Я пытаюсь создать небольшую программу для рисования коробок для изучения Core Data, и я думаю о добавлении методов «рисования» к подклассу NSManagedObject, чтобы представление могло просто сказать им рисовать для себя - это Допустимость

Итак, мой вопрос в одном предложении: какова «реальная» разница между подклассом NSManagedObject и любым другим классом - что Core Data делает с ним?

Если это слишком широко, я постараюсь сузить свой вопрос или что-то в этом роде.

1 Ответ

25 голосов
/ 31 октября 2011

Я до сих пор не понимаю, для чего предназначен подкласс NSManagedObject - какую роль он играет?

Удобство для разработчика - с точки зрения CodeSense, более короткого синтаксиса и некоторой компиляциивремя проверки, которые помогают предотвратить неправильное написание ключей.

так что я могу сделать с NSManagedObject?Каковы ограничения, правила, которые необходимо соблюдать, а какие нет?

Интерфейс, встроенный в Xcode, сделает для вас подклассы NSManagedObject - вам действительно не нужно делать это вручную- но, по сути, они просто NSManagedObject с некоторыми привязанными свойствами.Вместо использования @synthesize или чего-то подобного, вы используете @dynamic, и Apple позаботится обо всем остальном - подключив эти свойства к получателям / установщикам, которые имитируют то, что вы обычно делаете с «голым» NSManagedObject.

Я пытаюсь создать небольшую программу для рисования коробок для изучения Core Data, и я думаю о добавлении методов «рисования» в подкласс NSManagedObject, чтобы представление могло просто сказать им рисовать длясамо по себе - это разрешено?

Вы могли бы ... но я бы не стал.Это звучит как плохой дизайн - старайтесь держать ваши Model и Controllers отдельно.

Объекты модели не должны содержать бизнес-логики / кода для рисования.Используйте модель просто как «состояние» вашего приложения.Сделайте что-нибудь еще ответственным за рисунок.Кроме того, хотя я не могу сказать это с абсолютной властью, я считаю, что есть некоторые издержки, если вы имеете дело с обновлением / извлечением информации из NSManagedObject.

( По сути, это все равно, что иметь дело с NSDictionary ... sorta. Менее эффективно извлекать элементы из словаря, чем обращаться к ivar. )

Для приложения, которое выполняет такие вещи, как рисование - вы, вероятно, захотите избежать этих накладных расходов, создав структуру для ваших вещей в памяти и, возможно, вторую, аналогичную структуру для постоянства / сериализации (как в CoreData).

Итак, мой вопрос в одном предложении: какова "реальная" разница между подклассом NSManagedObject и любым другим классом - что Core Data делает с ним?

Я бы сказал - не делайте подкласс NSManagedObject вручную - используйте то, что дает вам Xcode.Если вам нужно больше (кроме, возможно, собственного конструктора), то вы, вероятно, лаете не на то дерево.

РЕДАКТИРОВАТЬ:

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

Чтобы уточнить и включить один из ответов:

Начните сконструктор моделей данных в Xcode, создайте свои модели и используйте следующую опцию меню:

enter image description here

Затем вы можете изменить сгенерированный класс, добавив в него пользовательский:

  • Конструкторы
  • Методы преобразования данных
  • Проверка
  • Форматирование
  • Дескрипторы сортировки
  • Фильтры

Если ваш вариант использования не помещается в этот список, вам следует серьезно подумать о том, чтобы поместить его в другое место (как в вашем примере с методом Draw).

Все эти вещи, упомянутые выше, могут быть привязаны к подклассу NSManagedObject, который был создан для нас XCode (мы не создавали «вручную»), - и все они вращаются вокруг работы с данными напрямую (форматы / преобразования / и т. д.) и / или извлечение данных из базовых данных (фильтры / сортировка).

Они не добавляют iVars, они не выполняют каких-либо сложных операций вне области хранения и поиска данных.

...