Управление обратными отношениями без CoreData - PullRequest
2 голосов
/ 05 октября 2009

Это вопрос к Objective-J / Cappuccino, но я добавил тег какао, так как рамки очень похожи.

Одним из недостатков Cappuccino является то, что CoreData еще не был перенесен, поэтому вам придется создавать все объекты модели вручную.

В CoreData ваши обратные отношения управляются автоматически для вас ... если вы добавляете объект к отношению ко многим в другом объекте, вы можете перемещаться по графику в обоих направлениях.

Без CoreData, есть ли какой-нибудь чистый способ автоматически настроить эти обратные отношения?

Для более конкретного примера, давайте возьмем типичный пример отдела и сотрудников. Чтобы использовать терминологию рельсов, в объекте «Департамент» много сотрудников, а «сотрудник» принадлежит отделу.

Таким образом, наша модель Отдела имеет NSMutableSet (или CPMutableSet) «сотрудники», который содержит набор Сотрудников, а наша модель Сотрудника имеет переменную «отдел», которая указывает на модель Отдела, которой он принадлежит.

Существует ли простой способ сделать так, чтобы при добавлении новой модели Employee в набор автоматически устанавливались обратные отношения (employee.department)? Или наоборот: если я задаю модель отдела сотрудника, он автоматически добавляется в набор сотрудников этого отдела?

Правильно знаю, я делаю объект, "ValidatedModel", который подкласс всех моих моделей, который добавляет несколько методов, которые устанавливают обратные отношения, используя KVO. Но я боюсь, что я делаю много бессмысленной работы, и что уже есть более простой способ сделать это.

Может кто-нибудь уложить мои заботы?

Ответы [ 4 ]

2 голосов
/ 05 октября 2009

Вы, вероятно, хотите установить отношения в вашем сеттере. Используя ваш пример, код Objective-J будет выглядеть примерно так:

- (void)setDepartment:(Department)aDepartment {
    if (department === aDepartment)
        return;

    [department addEmployee:self];
}

Как видите, нет необходимости сохранять / освобождать. Objective-J построен на JavaScript, который является сборщиком мусора. Все методы управления памятью реализованы, но ничего не делают (кроме загромождения вашего кода)

Кроме того, поскольку это javascript, обычно рекомендуется проверять равенство типов (===). Для получения дополнительной информации о равенстве типов см.

2 голосов
/ 06 октября 2009

ознакомьтесь с расширениями Cappuccino от этого сотрудника, работающего на Севере: http://github.com/nciagra/Cappuccino-Extensions

Включает порт ActiveRecord. На самом деле я еще не рассматривал ничего из этого, но это может помочь вам.

  • Johannes
2 голосов
/ 05 октября 2009

Я не могу говорить конкретно с Objective-J, но обычный способ сделать это без Базовых данных состоит в том, чтобы установить обратные отношения в установщике. Итак, используя пример сотрудников / отделов, вы бы сделали что-то вроде этого:

- (void)setDepartment:(Department *)aDepartment {
    if (department == aDepartment)
        return;

    [department release];
    department = [aDepartment retain];

    [department addEmployee:self];
}

Вы должны убедиться, что не обновляете переменную экземпляра, если новое значение уже соответствует существующему значению. Если вы этого не сделаете, setDepartment: вызовет addEmployee:, а addEmployee: вызовет setDepartment: в бесконечном цикле.

Также обратите внимание, что это открытое приглашение для циклов сохранения. Это зависит от того, как ваша модель структурирована, но объект, который «владеет» другим, должен retain его. Так что мой пример, возможно, не самый лучший, потому что, вероятно, правильнее будет сказать, что отдел «владеет» работником.

1 голос
/ 14 июня 2010

Вы также можете проверить эту реализацию CoreData по rbartolome. Я только посмотрел на это немного, но это выглядит как начало.

http://github.com/rbartolome/CoreData-Cappuccino

...