Core Data и Cocoa Bindings в среде Cocoa, Mac OS X

Cocoa

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

iOS: Cocoa bindings не поддерживается iOS.

 

Cocoa bindings и Core Data в значительной степени ортогональны. В общем, Cocoa bindings работают точно так же, с управляемыми объектами, как с другими объектами модели Cocoa. Вы также можете использовать те же объекты предикатов и дескрипторов сортировки, как вы используете для извлечения объектов из постоянного хранилища для фильтрации и сортировки объектов в памяти, например, чтобы представить в виде таблицы. Это дает вам последовательной API для использования в вашем приложении. Однако, имеются некоторые (обычно самоочевидные) различия в конфигурации и работе.

Дополнения к контроллерам

Основной областью, где Core Data добавляет Cocoa bindings находится в конфигурации контроллера объекта, таких как NSObjectController NSArrayController. Core Data добавляет следующие возможности для этих классов:

  • Ссылка на управляемый объект контекста, который используется для всех выборок, вставок и удалений.

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

  • Имя сущности, которая используется вместо класса объекта контента для создания новых объектов
  • Ссылка на предикат выборки, который ограничивает то, что извлекается устанавливая контент, если контент не установлен непосредственно
  • Опция "Deletes Objects On Remove" - которая удаляет связанные с контентом объекты, при удалении.

Флаг Automatically Prepares Content

Если флаг "automatically prepares content" (к примеру, setAutomaticallyPreparesContent:) установлен на контроллере, начальное содержание контроллера выбирается из своего контекста управляемого объекта, используя текущую выборкус предикатом контроллера. Важно отметить, что выборка контроллера выполнена в виде операции задержки, выполняемой после того, как контекст его управляемого объекта установлен (при загрузке nib)-поэтому это происходит после awakeFromNib и windowControllerDidLoadNib:. Это может создать проблемы, если вы хотите выполнить операцию с нонтентом объекта контроллера в любом из этих методов, так как контент контроллера равен nil. Вы можете обойти это, выполняя выборку "вручную" с помощью fetchWithRequest:merge:error:. Вы передаете nil, поскольку аргумент выборкb запроса использует стандартный запрос, как показано в следующем фрагменте кода.

- (void)windowControllerDidLoadNib:(NSWindowController *) windowController
{
    [super windowControllerDidLoadNib:windowController];

    NSError *error = nil;
    BOOL ok = [arrayController fetchWithRequest:nil merge:NO error:&error];
    // ...

Наследование сущности

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

Фильтрующий предикат для отношений ко-многим

Иногда вам может понадобиться создать предикат фильтра для поля поиска, который позволяет пользователю отфильтровать содержимое контроллера массива на основе назначения ко-многим. Если вы хотите найти отношение ко-многим, вам нужно использовать ANY или ALL в предикате. Например, если вы хотите получать Департаменты, в которых по крайней мере один из сотрудников имеет имя "Алексей", можно использовать оператор ANY, как показано в следующем примере:

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"ANY employees.firstName like 'Алексей'"];

Вы можете использовать тот же синтаксис в bindings поле предиката поиска:

ANY employees.firstName like $value
 
Примечание: Вы не можете использовать contains оператор (например, ANY employees.firstName contains 'Алексей'), потому что contains оператор не работает с ANY оператором.

Все гораздо сложнее, если вы хотите, соответствовать префиксу и/или суффиксу -к примеру, если вы хотите посмотреть на Департаменты, в которых по крайней мере один из сотрудников имеет имя "Алексей", "Алекс", "Александр », или любым другим именем, начинающиеся с "Алекс". В принципе вам просто нужно добавить полное сопоставление:

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"ANY employees.firstName like 'Matt*'"];

Вы не можете, однако, использовать тот же синтаксис в bindings поле предиката поиска:

// Не будет работать

ANY employees.firstName like '$value*'

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

NSString *value = @"Алекс";
NSString *wildcardedString = [NSString stringWithFormat:@"%@*", value];
[[NSPredicate predicateWithFormat:@"ANY employees.firstName like %@", wildcardedString];

Подразумевается, что вы должны написать код для поддержки этого поведения.

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