Расширьте NSMutableArray для двунаправленного управления ассоциациями - PullRequest
3 голосов
/ 07 июля 2010

Я большой поклонник генерации кода (из UML) и из мира Java. Мне интересно, как бы я внедрил автоматизированное двунаправленное управление ассоциациями в Objective-C.

Изображение партнера по ассоциации <-> Адрес, один-ко-многим и судоходный с обоих концов.Чего я хотел бы добиться, так это того, чтобы при добавлении адреса к партнеру этот объект адреса автоматически узнал о своем партнере.

Таким образом, для шаблона реализации было бы иметь NSMutableArray * на стороне партнера и партнера* на адресной стороне.Свойство на стороне адреса легко реализовать, так как setPartner: (Partner *) aPartner может автоматически вставлять Address (self) в NSMutableArray партнера, управляющего адресами.Другая сторона, однако, не так проста в реализации.Стандартным шаблоном реализации для многих ссылок в Objective-C, по-видимому, является NSMutableArray, который можно получить с помощью метода get @property.Объект, обладающий этим NSMutableArray, может затем вставить объект Address в массив, который, конечно, не будет обновлять другую сторону.

Я знаю, что, например, существуют другие шаблоны для такого типа управления ассоциациями., через методы addTo ... () и removeFrom ... ().Но я пока не знаю, будет ли это соответствовать другим принципам программирования Какао или даже мешать мне эффективно использовать Какао.Я думаю о Интерфейсном Разработчике здесь.Не очень много опыта, но я видел нечто, называемое ArrayController, которое кажется довольно удобным, но которое также, похоже, ожидает, что свойство типа NSMutableArray будет работать с.И если этот парень вставляет объекты в массив, мне нужно перехватить это и выполнить настройку с другой стороны.

Как программист на Java, я бы предпочел теперь создать подкласс NSMutableArray и переопределить некоторые из его методов, которые затем могли бы манипулировать другимиконец.Будет ли это вообще возможно?Я читал о категориях, но до сих пор я понял, что могу только добавлять методы к классу таким образом, не переопределяя их и не добавляя в структуру.Или это должен быть метод переадресации?Я в замешательстве прямо сейчас.Если бы вы могли указать мне правильное направление мышления, это было бы так здорово.Большое спасибо!

1 Ответ

9 голосов
/ 07 июля 2010

Добро пожаловать в Какао.Не делайте подклассы встроенных коллекций.Вы сойдете с ума.

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

Обычный обходной путь - создание нового подкласса NSObject, который "оборачивает"«NSArray (т. е. он имеет массив в качестве переменной экземпляра [« field »]), а затем вы вызываете методы в пользовательской оболочке, и оболочка содержит всю необходимую пользовательскую логику.

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

...