Управляемые объекты Core Data в среде Cocoa, Mac OS, iOS

Cocoa

Основы

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

Управляемый объект связан с описанием сущности (экземпляр NSEntityDescription), который предоставляет метаданные об объекте (в том числе имя сущности, которое представляет объект и имена его атрибутов и связи) и управляемый объект связи, который отслеживает изменения в графе объектов.

Управляемый объект также связан с управляемым объектом контекста ("context"). В данном контексте, управляемый объект представляет запись в постоянном хранилище. В данном контексте для предоставленной записи в постоянном хранилище, может быть только один, соответствующий управляемый объект, но там может быть несколько контекстов каждый из которых содержит отдельный управляемый объект, представляющий эту запись. Иными словами, есть один-к одному связь между управляемым объектом и записьюи данных, которую он представляет, но связь ко-многим между записью и соответствующими управляемыми объектами.

Свойства и хранение данных

В некоторых отношениях NSManagedObject ведет себя аналогично словарю, это общий объект-контейнер, который эффективно обеспечивает хранение свойств определяемых связанным объектом NSEntityDescription. NSManagedObject обеспечивает поддержку ряда распространенных типов для значений атрибутов, в том числе строк, датт и чисел. Поэтому обычно не нужно определять переменные в подклассах. Есть некоторые соображения относительно производительности, которые необходимо иметь в виду, если вы используете большие двоичные объекты данных (BLOB).

Нестандартные атрибуты

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

Иногда необходимо использовать типы, которые не поддерживаются непосредственно, такие как цвет и C структуры. Например, в графическом приложении вы можете определить сущность прямоугольника, имеющую атрибуты цвета и границ, являющиеся экземплярами NSColor и NSRect структур соответственно. В этом случае может потребоваться создание подкласса NSManagedObject.

Даты и время

NSManagedObject представляет атрибуты даты с помощью NSDate объектов и сохраняет время внутри как NSTimeInterval значение с отчетной даты (которая имеет часовой пояс GMT). Часовые пояса явно не хранятся, поэтому, вы всегда должны представлять дату в Core Data атрибутах в GMT, таким образом, поиски нормализуются в базе данных. Если вам нужно сохранить информацию о часовом поясе, нужно хранить атрибут часового пояса в вашей модели. Это, однако, может снова потребовать создать подкласс NSManagedObject.

Пользовательские классы управляемых объектов

В сочетании с описанием сущности в управляемой объектной модели, NSManagedObject содержит богатый поведенческий набор по умолчанию, включая поддержку для любого свойства и проверки значения. Есть, тем не менее много причин, почему вы, возможно, пожелаете использовать подкласс NSManagedObject для реализации пользовательских функций. Есть, однако, и некоторые вещи, которых следует избегать при использовании подклассов. Важно также знать, что Core Data управляет жизненным циклом моделируемых свойств.

Переопределение методов

NSManagedObject сам адаптирует многие особенности NSObject, чтобы управляемые объекты могли быть интегрированы в инфраструктуру Core Data. Core Data опирается на реализацию NSManagedObject на следующих методах, которые, следовательно, вы не должны изменять: primitiveValueForKey:, setPrimitiveValue:forKey:, isEqual:, hash, superclass, class, self, zone, isProxy, isKindOfClass:, isMemberOfClass:, conformsToProtocol:, respondsToSelector:, retain, release, autorelease, retainCount, managedObjectContext, entity, objectID, isInserted, isUpdated, isDeleted и isFault. Вам не рекомендуется переопределить description, если этот метод вызывает ошибку во время отладки, результаты могут быть непредсказуемыми и initWithEntity:insertIntoManagedObjectContext:. Вы должны, как правило, изменять методы кодирования ключ-значение, такие как valueForKey: и setValue:forKeyPath:.

В дополнение к методам, которые вы не должны переопределять, есть и другие, так если вы их изменяете, то вы должны сначала ссылаться на реализацию суперкласса, в том числе для awakeFromInsert, awakeFromFetch и методов проверки, таких как validateForUpdate.

Смоделированные свойства

В Mac OS X 10.5 и выше, Core Data динамически генерирует эффективные общедоступные и приватные методы доступа для получения и установки атрибутов и методы доступа для свойств отношений, которые определены в сущности соответствующей модели управляемого объекта. Как правило, таким образом, вам нет надобности писать специальные методы акцессоры для моделируемых свойств.

В подклассах управляемого объекта, можно объявить свойства моделируемых атрибутов в интерфейсном файле, но вы не объявляете переменные:

@interface MyManagedObject : NSManagedObject {

}
@property (nonatomic, retain) NSString *title;
@property (nonatomic, retain) NSDate *date;
@end

Обратите внимание, что свойства объявляются как nonatomic и retain. Для повышения производительности Core Data обычно не копирует значения объекта, даже если значение класса принимает NSCopying протокол.

В реализации файла, необходимо указать свойства как dynamic:

@implementation MyManagedObject
@dynamic title;
@dynamic date;
@end

Поскольку Core Data заботится о жизненном цикле моделируемых свойств, в ссылочно-подсчетной среде, Вы не освобождаете моделируемые свойства в dealloc. (Если вы добавили собственные свойства, которые не указаны в управляемой объектной модели, то применяются обычные правила Cocoa).

Жизненный цикл объекта инициализация и освобождение

Когда управляемый объект будет создан, он инициализируется со значениями по умолчанию для данной сущности в управляемой объектной модели. Во многих случаях устанавления значения по умолчанию в модели может быть недостаточным. Иногда, однако, вы можете выполнить дополнительную инициализацию, возможно, с использованием динамических значений (например, текущей даты и времени), которые не могут быть представлены в модели.

В обычном классе Cocoa, обычно переопределяют назначенный инициализатор (чаще init метод). В подклассе NSManagedObject, существуют три различных способа настройки инициализации, путем переопределения initWithEntity:insertIntoManagedObjectContext:, awakeFromInsert или awakeFromFetch. Вы не должны переопределять init. Вам не рекомендуется переопределять initWithEntity:insertIntoManagedObjectContext:, внесенные в этот метод изменения не могут быть должным образом интегрированы с отменой (undo) и возвратом (redo). Два других метода, awakeFromInsert и awakeFromFetch, позволяют различать две различные ситуации:

  • awakeFromInsert вызывается только один раз во время жизни объекта, когда он впервые создан.

    awakeFromInsert вызывается сразу же после вызова initWithEntity:insertIntoManagedObjectContext: или insertNewObjectForEntityForName:inManagedObjectContext:. Вы можете использовать awakeFromInsert для инициализации специфичного значения свойств по умолчанию, таких как дата создания объекта, как показано в следующем примере.

    - (void) awakeFromInsert
    {
        [super awakeFromInsert];
        [self setCreationDate:[NSDate date]];
    }
  • awakeFromFetch вызывается, когда объект повторно инициализирован из постоянного хранилища (в выборке).

    Вы можете изменить awakeFromFetch, например, установить временное значение и другие варианты кэша. Изменение обработки явно отключено вокруг awakeFromFetch, чтобы можно было удобно пользоваться общедоступным набором методов доступа не пачкая объект или его контекст. Это не значит, что вы не должны манипулировать ссылами, так как изменения не будут должным образом распространяются на предмет назначения или объекты. Вместо этого, вы можете изменить awakeFromInsert или использовать любой из методов связанный с циклом выполнения, таких как performSelector:withObject:afterDelay:.

Вы должны как правило, не переопределять dealloc или finalize, чтобы очистить временные свойства и другие переменные. Вместо этого вы должны переопределять didTurnIntoFault. didTurnIntoFault вызывается автоматически Core Data, когда объект превращается в сброшенный и сразу же до фактического освобождения. Вы можете превратить управляемый объект в сброшенный специально для снижения накладных расходов памяти, поэтому важно, чтобы вы правильно выполнять зачистоки в didTurnIntoFault.

Проверка

NSManagedObject обеспечивает постоянные ловушки для проверки свойств и значений между значениями свойств. Как правило, нет необходимости переопределять validateValue:forKey:error: вместо вы должны реализовать методы проверки в форме validate<Key>:error:, как это определено в NSKeyValueCoding протоколе. Если вы хотите проверить между значениями свойств, можно переопределить validateForUpdate: и/или связанные с ними методы проверки.

Вы не должны вызывать validateValue:forKey:error: для пользовательской проверки свойств, если Вы это сделаете вы создадите бесконечный цикл, когда validateValue:forKey:error: вызывается во время выполнения. Если вы реализуете собственные методы проверки, вы не должны как правило, вызывать их напрямую. Вместо этого вам следует обратиться к validateValue:forKey:error: с соответствующим ключом. Это гарантирует, что любые ограничения, определенные в управляемой объектной модели применятся.

При реализации пользовательских методов проверки между свойствоми (например, validateForUpdate:), вам следует обратиться к реализации суперкласса в первую очередь. Это гарантирует, что отдельные методы проверки свойств также вызываются. При наличии нескольких неудач проверки за одну операцию, вы должны собрать их в массив и добавить массива с помощью ключа NSDetailedErrorsKey к userInfo словарю NSError объекта по возвращению.

Сбрасывание

Управляемые объекты обычно представляют данные, хранящиеся в постоянном хранилище. В некоторых ситуациях управляемый объект может быть "сброшенным"-объектом, т.е. значения свойств еще не были загружены из внешнего хранилища данных. Когда вы получаете доступ к постоянным значениям свойств, сброшенный объект "сигнализирует", и данные извлекаются из хранилища автоматически. Это может быть сравнительно дорогостоящий процесс (возможно, потребуется обращение к постоянному хранилищу).

 
 
homeЗаметили ошибкукарта сайта 
   Made on a Mac