2009-10-05 4 views
2

Это вопрос для Objective-J/Cappuccino, но я добавил тег cocoa, так как структуры настолько похожи.Управление обратными отношениями без CoreData

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

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

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

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

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

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

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

Может ли кто-нибудь оставить мои проблемы на отдыхе?

ответ

2

Я не могу говорить конкретно с Objective-J, но обычный способ сделать это без Core Data - установить обратную связь в сеттер. Таким образом, используя в качестве примера сотрудников/отделов, вы могли бы сделать что-то вроде этого:

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

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

    [department addEmployee:self]; 
} 

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

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

+0

Спасибо, это в основном то, что я делаю. (За исключением использования KVO для запуска при изменении любой из сторон и добавлении другого.) Так что, похоже, я на правильном пути, спасибо. –

+0

Если это то, что вы делаете, вы на правильном пути. Я думаю, что мой подход _may_ будет немного легче только из-за накладных расходов на выполнение KVO, но любой из них должен работать нормально. – Alex

+0

Основная причина, по которой я использую KVO, заключается в том, что у меня нет модификации созданных аксессуаров. Вместо этого в моем методе init я вызываю метод, описывающий тип отношения, какое свойство использовать и каково свойство обратной зависимости. Это автоматически настраивает наблюдателей и т. Д. Я поделюсь над кодом после того, как у меня все получится. –

2

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

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

    [department addEmployee:self]; 
} 

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

Кроме того, потому что это Java-это вообще желательно, чтобы проверить тип равенства (===) Для получения дополнительной информации по типу равенства см: http://www.webreference.com/js/column26/stricteq.html

+0

Да, не нужно беспокоиться о сохранении/освобождении. Я буду иметь в виду тип равенства, спасибо! –

2

проверить расширение Каппучино от этого 280 Северного сотрудника: http://github.com/nciagra/Cappuccino-Extensions

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

  • Johannes
+0

Это выглядит очень круто, мне придется исследовать это больше. Если я не ошибаюсь, я думаю, что он заботится о большей части проверки и т. Д. На стороне сервера. Это важно делать, конечно, но я думаю, что валидация на стороне клиента также важна, чтобы дать быстрый опыт пользователю. –

Смежные вопросы