Разработка основанного на документе приложения

UIDocument класс, представленный в iOS 5.0, играет основную роль в основанных на документе приложениях для iOS. Это - абстрактный базовый класс — подразумевать, что для Вас для имения чего-то полезного необходимо создать подкласс его, создающийся в соответствии с нуждами приложения. Специализированный код, который Вы добавляете к приращениям подкласса что UIDocument делает возможным: эффективное поведение документов в мобильной среде интегрировалось с хранением iCloud.

Почему создают основанное на документе приложение?

Когда Вы имеете идею для любого приложения и садитесь для разработки его, необходимо оценить множество опций. Какой стиль приложения необходимо использовать (основная подробность, основанная на странице утилита, игра OpenGL, и т.д.)? Приложение сделает свое собственное получение, оно будет реагировать на жесты или касаться событий, и оно включит аудиовизуальные активы? Чем модель данных будет — например, приложение должно использовать Базовые Данные? Решение, сделать ли Ваше основанное на документе приложения, могло бы казаться, усложнило бы тот ряд выбора, но это действительно сводится к тому, как Вы ожидаете, что люди будут использовать Ваше приложение.

Основанные на документе приложения идеальны, даже необходимы, когда пользователи ожидают вводить и редактировать содержание в визуальном контейнере и хранилище, которое содержание под именем они указывают. Каждый контейнер информации — документа — уникален. Вы несомненно знакомы с несколькими типами основанных на документе приложений, найденных и в настольных и в мобильных системах. Для именования некоторых существуют текстовые процессоры, электронные таблицы и графические редакторы. С технологией iCloud у Вас есть еще более неопровержимый довод для создания основанного на документе приложения. Ваши пользователи, например, могли создать документ с помощью приложения в настольной системе OS X и затем позже, не имея необходимость делать любую синхронизацию или копирование, редактировать тот документ о iPad с помощью версии iOS приложения. Эта функция дает им дополнительное стимулирование для покупки приложения.

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

Документ в iOS

Несмотря на то, что широкое определение документа является “контейнером информации”, тот контейнер может быть просмотрен несколькими способами. Пользователю документ является текстом, изображения, формы и другие формы информации, которую он или она создает, редактируют и сохраняют под уникальным именем. Документ может также относиться к файлу документа: персистентное, дисковое представление данных документа. И документ может означать a UIDocument объект, представляющий и управляющий представлением в оперативной памяти тех же самых данных.

Объект документа также играет ключевую роль в преобразовании данных документа между его представлением на диске к его представлению в памяти. Это сотрудничает с UIDocument класс в записи данных документа к файлу и чтению тех данных. Для записи документ обычно обеспечивает снимок данных, которые могут быть записаны в файл документа; для чтения это получает данные и инициализирует объекты модели документа с ним. Документ, в некотором смысле, является кабелепроводом между данными, хранившими в файле и внутренним представлением тех данных. Рисунок 1-1 иллюстрирует эти отношения.

  Файл документа рисунка 1-1, объект документа и объекты модели, которыми управляет объект документа

Документ в Хранении iCloud

В iCloud файлы находятся локально в контейнерном каталоге, связанном с приложением. Тот каталог имеет внутреннюю структуру, включающую, самое главное, a Documents подкаталог. В схеме iCloud, файлах и пакетах файла, записанных в Documents подкаталог считают файлами документов — даже если они не происходят из основанных на документе приложений. Файлы, записанные в другие расположения в контейнерном каталоге, считают файлами данных.

Объекты документа являются предъявителями файла потому что UIDocument класс принимает NSFilePresenter протокол. Предъявитель файла используется вместе с NSFileCoordinator объекты скоординировать доступ к файлу или каталогу среди объектов приложения и между приложением и другими процессами. Предъявитель файла вовлечен в доступ других клиентов того же представленного файла или каталога.

Когда пользователи просят хранить файлы документов в хранении iCloud, основанное на документе приложение должно сохранить те файлы (включая пакеты файла) в Documents подкаталог каталога контейнера iCloud. Посмотрите Управление Жизненным циклом Документа для специфических особенностей. Для получения дополнительной информации о iCloud мобильные контейнеры, см. Руководство по проектированию iCloud.

Свойства объекта UIDocument

Объект документа имеет несколько свойств определения, большинство которых касается ее роли менеджера данных документа. Эти свойства объявляются UIDocument класс.

  • Файл URL. Документ должен иметь расположение, где он может быть сохранен, является ли то расположение в локальной файловой системе или в хранении iCloud. fileURL свойство идентифицирует это расположение. Когда Вы создаете a UIDocument объект, необходимо указать файл URL как параметр initWithFileURL: метод инициализатора UIDocument.

  • Название документа. A UIDocument объект получает название документа по умолчанию из компонента имени файла файла URL и хранит его в localizedName свойство. Можно переопределить метод получателя этого свойства обеспечить пользовательское, локализованное название документа.

  • Тип файла. Типом файла является Uniform Type Identifier (UTI), полученный из расширения файла URL и присвоенный fileType свойство. Для получения дополнительной информации посмотрите, Как iOS Идентифицирует Документы Вашего Приложения.

  • Дата модификации. Дата файл документа была в последний раз изменена. Это значение сохранено в fileModificationDate свойство. Это может быть использование для того, чтобы (среди прочего) разрешить конфликты версии документа.

  • Состояние документа. Документ находится в одном из нескольких возможных состояний во время его жизни во время выполнения. Эти состояния могут указать, например, что была ошибка в сохранении документа или что там конфликтуют версии документа. UIDocument хранит состояние текущего документа в documentState свойство. Для получения информации о наблюдении изменений в состоянии документа посмотрите Контролирующие Изменения состояния документа и Ошибки из-за неправильного обращения.

Конструктивные соображения для основанных на документе приложений

Перед записью строки кода для основанного на документе приложения это стоит Вашего, в то время как думать о нескольких вопросах проектирования.

Определение объектных отношений

Как со всеми приложениями, необходимо разработать общий замысел для объектов основанного на документе приложения, основывающегося на шаблоне разработки Контроллера представления Модели (MVC). Несмотря на то, что следующий проект MVC для документов рекомендуется, Вы свободны придумать свои собственные проекты объектного отношения.

В условиях MVC документ является модельным контроллером; это «владеет» и управляет объектами модели, представляющими содержание документа. Сам объект документа принадлежит и управляется контроллером представления. Контроллер представления, по определению, также управляет представлением, представляющим содержание, которым управляет объект документа. Это - таким образом посреднический контроллер в этой сети отношений, получая данные, которые это должно представить в представлении от объекта документа и передающих данных, вводимых или измененных пользователями на объект документа. Рисунок 1-2 изображает эти объектные отношения.

Рисунок 1-2  контроллер представления управляет и объектом документа и представлением что данные документа подарков

Так же, как контроллер представления встраивает свое представление, контроллер представления мог бы встроить объект документа как заявленное свойство. Когда Ваше приложение инстанцирует контроллера представления, оно инициализирует его с объектом документа или с файлом документа URL (из которого сам контроллер представления может создать объект документа).

Конечно, основанное на документе приложение будет иметь другие контроллеры представления (с их представлениями) и возможно другие объекты модели. Для понимания то, что могли бы требоваться другие контроллеры представления посмотрите Разработку Пользовательского интерфейса.

Разработка пользовательского интерфейса

Ни UIKit, ни инструменты разработчика не предоставляют поддержки для пользовательского интерфейса основанного на документе приложения. Например, существует нет UIDocumentView класс или UIDocumentViewController класс и нет никакого стандартного интерфейса для выбора документов. Вместо того, чтобы сожалеть об отсутствии, возьмите его в качестве возможности создать пользовательский интерфейс для Вашего основанного на документе приложения, заставляющего его стоять из конкуренции.

Тем не менее, все основанные на документе приложения должны позволить их пользователям сделать определенные вещи, требующие элементов пользовательского интерфейса; они включают следующее:

  • Просмотр и редактирование документа

  • Создание нового документа

  • Выбор документа из списка документов принадлежит приложению

  • Открытие, закрываясь и удаляя выбранный документ

  • Помещение выбранного документа в хранении iCloud (и удаление выбранного документа от хранения iCloud)

  • Указание состояний ошибки, включая конфликты версии документа

  • Отмена и восстановление изменений (рекомендуемый, но не требуемый)

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

Выбор типов, форматов и стратегий данных документа

При разработке модели данных для основанного на документе приложения критически важно, что Вы спрашиваете и отвечаете на следующие вопросы:

Каков тип моего документа?

Документ должен иметь тип документа, набор информации, характеризующей документ и связывающей его с приложением. Тип документа имеет имя, (дополнительный) значок, разряд обработчика и Uniform Type Identifier (UTI), соединяющийся с одним или более расширениями файла. Для приложения для редактирования того же документа в iOS и в OS X информация о типе документа должна быть непротиворечивой.

Создание и Конфигурирование Проекта объясняют, как указать типы документов в основанном на документе приложении для iOS. См. Универсальный Обзор Идентификаторов типов для описания UTIs и Универсальной Ссылки Идентификаторов типов для описаний общих Универсальных Идентификаторов типов.

Как я должен представлять данные документа, записанные в файл?

У Вас есть в основном три выбора:

  • Базовые Данные (база данных). Базовые Данные являются технологией и платформой для управления графа объектов и персистентности. Это может использовать встроенную библиотеку данных SQLite в качестве системы баз данных. UIManagedDocument класс, подкласс UIDocument, предназначается для основанных на документе приложений те Данные Ядра использования.

  • Поддерживаемые объектные форматы. UIDocument поддержки NSData и NSFileWrapper объекты как собственный компонент вводят для представления данных документа. NSData предназначается для плоских файлов, и NSFileWrapper предназначается для пакетов файла, которые являются каталогами, которые iOS обрабатывает как единственный файл. Если Вы даете UIDocument один из этих объектов, это сохраняет его к файловой системе без дальнейшего участия с Вашей стороны.

  • Форматы пользовательского объекта. Если Вы хотите, чтобы данные документа, записанные в файл, имели тип кроме NSData или NSFileWrapper, можно записать его в файл сами в переопределении определенного UIDocument метод. Следует иметь в виду, что Ваш код должен будет копировать что UIDocument делает для Вас, и таким образом, необходимо иметь дело с большей сложностью и большей возможностью ошибки. См. Ссылку класса UIDocument для получения дополнительной информации.

Почему я хотел бы хранить свои данные документа в базе данных вместо файла?

Если набор данных, которым управляет Ваш объект документа, является прежде всего графиком большого объекта, но Ваше приложение использует только подраздел того графика в любое время, то UIManagedDocument и Базовые Данные являются хорошей опцией. Базовые Данные дают много преимуществ основанному на документе приложению:

  • Инкрементное чтение и запись данных документа

  • Поддержка отмены и операций восстановления

  • Автоматическая поддержка разрешения конфликтов версии документа

  • Совместимость данных для межплатформенных приложений

«Недостаток» к Базовым Данным - то, что это - сложная технология; это занимает время, чтобы познакомиться с его понятиями, классами и методами. Для узнавания больше считайте Базовую Ссылку класса Руководства по программированию и UIManagedDocument Данных.

Какой из поддерживаемых объектных форматов (NSData или NSFileWrapper) является лучшим для моего приложения?

Используете ли Вы NSData или NSFileWrapper объект для данных документа зависит от того, как сложный, который данные и от того, может ли часть графика объекта модели Вашего документа быть выписана отдельно к файлу. Например, если Ваши данные документа являются простым текстом и ничем иным, тогда NSData подходящий контейнер для него. Если, однако, данные имеют многократные компоненты — например, текст и изображения — использование NSFileWrapper методы для создания пакета файла для данных.

Интерфейсные объекты файла — и пакеты файла, которые они представляют — предлагают некоторые преимущества перед объектами двоичных данных.

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

  • Обертки файла (и пакеты файла) упрощают присваивать версию документам. Пакет файла, например, может содержать файл списка свойств, содержащий информацию о версии и другие метаданные о документе.

Хранить Данные Документа в Пакете Файла обсуждает (и иллюстрирует), как Вы используете NSFileWrapper объект представлять данные документа в форме, которая может быть выписана как пакет файла.

Я могу заархивировать свой график объекта модели и иметь это, NSData возражают записанный в файл документа?

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

Что, если мой файл документа является очень большим?

Если данные, хранившие в файле документа, могут быть большими, Вам, возможно, придется записать и считать данные инкрементно для обеспечения хорошего пользовательского опыта. Существует несколько подходов, которые Вы могли бы проявить:

  • Использовать UIManagedDocument. Помните, Базовые Данные дают Вам инкрементное чтение и запись «бесплатно».

  • Сохраните отделимые компоненты своих данных документа в пакете файла.

  • Переопределите методы низшего уровня UIDocument и сделайте инкрементное чтение и запись данных сами. (См. Ссылку класса UIDocument для подробных сведений.) Необходимо всегда использовать API для инкрементного чтения и пишущий, что это является надлежащим типу данных; например, платформа Основы AV имеет методы для инкрементного чтения больших мультимедийных файлов.

Что я должен думать о том, если я хочу, чтобы мои документы были доступны для редактирования на обеих платформах?

Если Ваши пользователи могут создать и отредактировать документы и на мобильных устройствах iOS (iPhone, iPad, и на касании iPad) и в настольных системах OS X, Ваше приложение будет иметь конкурентное преимущество. Но для этого, чтобы быть возможным, формат данных документа по обеим платформам должен быть совместимым. Некоторые важные соображения для совместимости данных документа:

  • Некоторые технологии доступны на одной платформе, но не другом. Например, если Вы будете использовать RTF в качестве формата документа в OS X, то тот формат не будет работать в iOS, потому что его текстовая система не поддерживает обогащенный текст.

  • Соответствующие классы в каждой платформе не совместимы. Это - особенно истина с цветами (UIColor и NSColor), изображения (UIImage и NSImage), и пути Безье (UIBezierPath и NSBezierPath). NSColor объекты, например, определяются с точки зрения цветового пространства (NSColorSpace), но в UIKit нет никакого класса цветового пространства.

    При определении свойства документа с помощью одного из этих классов необходимо разработать путь (при подготовке данных документа к записи) для преобразования свойства в форму, которая может быть точно перераспределена на другой платформе. Один способ сделать это к «выпадающему» к платформе низшего уровня, совместно использующейся обеими платформами. Например, UIColor определяет a CIColor имущественные ценности Базовый Объект изображения, представляющий цвет; на стороне OS X Ваше приложение может создать NSColor объект от CIColor объект с помощью colorWithCIColor: метод класса.

  • Система координат по умолчанию для каждой платформы отличается, и это различие может влиять, как нарисовано содержание. (См. Системы координат и Рисующий в iOS в Рисовании и Печати Руководства для iOS для обсуждения этой темы).

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