Совместное использование кода между NSDocument и UIDocument

Я создал приложение на основе документов, которое использует Core Data. Сначала я создал версию для Mac, и теперь, когда она работает правильно, я перехожу к созданию ее версии для iOS.

Я просто не могу понять, как максимально увеличить повторное использование кода между версиями iOS / Mac в отношении бита данных Core, поскольку они не используют одни и те же классы.

Мой класс документов, который обрабатывает сохранение, является подклассом NSPersistentDocument. Мое намерение состоит в том, чтобы хорошо спроектированный класс модели работал в обеих средах, тем более что я не делаю так много причудливых вещей в отношении данных Core.

Теперь, когда NSPersistentDocument недоступен в iOS, я упал. Я попытался обойти это, используя #if TARGET_OS_MAC and TARGET_OS_IPHONE и таким образом сделав его подклассом UIManagedDocument в версии iOS. Очевидно, это было бы удобно, но я не могу заставить это работать так. И это действительно выглядит довольно запутанным, поскольку есть много других вещей, которые также должны быть обусловлены.

Я также попытался построить классы поверх _5 _ / _ 6_, реализовав собственные перехватчики данных Core, но это также выглядит довольно запутанным, заставляя меня думать, что это неправильный путь.

Вопрос:

Мне кажется хорошей идеей повторно использовать один и тот же класс документа в версиях iOS / Mac, но, возможно, я наивен.

Как лучше всего это сделать?

Следует ли мне забыть о совместном использовании кода и создать отдельный класс документа для версии iOS, который имитирует все методы, присутствующие в версии для Mac?


person Frost    schedule 26.03.2012    source источник
comment
Я не могу говорить об этом конкретном сценарии, но было бы полезно рассмотреть общий случай: у вас есть два класса, которые должны наследовать от разных суперклассов, но у вас есть код, который вы хотите разделить между ними. Обычный ответ на это (в ObjC) - композиция: поместить общий код в другой класс и ссылаться на экземпляр этого класса из обоих.   -  person rickster    schedule 27.03.2012
comment
Это кажется хорошей идеей. Пожалуйста, отправьте ответ, и я его выберу. Один дополнительный вопрос: похоже, что я пишу 20-30 методов в своем составном объекте, который перенаправляет их только одному и тому же методу на специализированном приемнике. Есть ли способ лучше?   -  person Frost    schedule 27.03.2012


Ответы (2)


(Вывод из моего комментария.)

В общем, ситуация, когда у вас есть два класса, которые должны наследовать от разных суперклассов, но которые также хотят совместно использовать большой объем кода, - это композиция. Поместите общий код в отдельный класс; каждый из ваших подклассов NSDocument и UIDocument может хранить экземпляр этого класса и отправлять ему сообщения всякий раз, когда им нужно вызвать этот общий код. (Хотя, как упоминает @noa, вы можете для начала подумать, весь ли этот код принадлежит вашему классу документа.)

Конечно, тогда вы можете написать кучу методов, которые выглядят примерно так:

- (id)doSomething {
    return [sharedController doSomething]
}

Это может стать проблемой ... так что вы можете изучить Objective-C система пересылки сообщений.

person rickster    schedule 27.03.2012
comment
Примечание для будущих читателей: я выбрал это как ответ на вопрос, но мне пришлось отказаться от него в моем конкретном случае после того, как стало очевидно, что существует множество методов пересылки, которые необходимо написать и поддерживать в актуальном состоянии. Вместо этого я решил сохранить отдельные классы для реализаций iOS и Mac, так как это казалось более практичным. - person Frost; 14.04.2012

Я прав в том, что код, которым вы хотите поделиться, связан с моделью? Я предлагаю преобразовать этот код в отдельный объект, который содержит как NSDocument, так и UIDocument (как предложил Рикстер выше).

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

Это может показаться странным, но на самом деле NSDocument и UIDocument являются классами контроллеров. (Чтобы быть конкретным, они являются частью модели-контроллера.) Их работа заключается в загрузке модели, настройке окон и сохранении модели. Если вам нужно предоставить интерфейс для доступа более высокого уровня к объектам модели, он может быть в корне документа или вспомогательном классе модели.

Аналогичным образом работа NSPersistentDocument состоит в настройке контекста управляемого объекта и постоянного хранилища, а также в обработке загрузки и сохранения. Не обязательно предоставлять полный интерфейс для доступа к модели.

person paulmelnikow    schedule 27.03.2012