Совместное использование кода между NSDocument и UIDocument - PullRequest
4 голосов
/ 27 марта 2012

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

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

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

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

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

Вопрос:

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

Какой лучший способ сделать это?

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

Ответы [ 2 ]

3 голосов
/ 27 марта 2012

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

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

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

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

2 голосов
/ 27 марта 2012

(Подчеркну это из моего комментария.)

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...