Приложения Shoebox / Library с автосохранением и версиями в OS X Lion

У нас есть приложение в стиле обувной коробки, которое мы хотим сделать в Lion первоклассным гражданином. Это означает, среди прочего, интеграцию автоматического сохранения и версий. В настоящее время у нас нет модели, ориентированной на документы, и мы просто используем простой стек Core Data.

UIPersistentDocument предоставляет действительно простой способ интеграции как автоматического сохранения, так и версий, и я вижу два варианта, которые мы могли бы выбрать для интеграции с новыми API:

  1. «Злоупотреблять» NSPersistentDocument для нашего приложения в стиле обувной коробки. Технически это будет приложение, основанное на документах, но пользовательский интерфейс останется той же библиотекой, похожей на iPhoto. Концептуально это не имеет большого смысла, но мы получили бы много функциональности бесплатно.
  2. Сохраните текущий простой стек основных данных и внедрите автоматическое сохранение и версии вручную.

Я слышал противоречивые мнения от представителей Apple о подходе, который мы должны использовать, и было бы здорово прояснить ситуацию, прежде чем мы начнем реализацию. Хотя я думаю, что 1. не следует использовать, это также очень заманчиво, потому что мы получаем многое бесплатно. Я даже не смог найти достаточно документации по ручной реализации автосохранения и версий в приложении Core Data.

Я бы действительно предпочел использовать 1. но вижу некоторые проблемы:

  • Меня беспокоят конфликты на уровне файловой системы при использовании версий и только одного файла базы данных. Я не смог найти никакой документации по этой теме.
  • Меня беспокоят проблемы с производительностью в версиях при просмотре «пространства».
  • Мы не можем использовать только один экземпляр открытой базы данных, поскольку версии должны открывать несколько экземпляров. Я беспокоюсь о побочных эффектах и ​​проблемах параллелизма. Концептуально это выглядит как хак, а я хаки не люблю.

Если бы мы хотели интегрировать только синхронизацию iCloud, я бы точно не стал думать об использовании модели, ориентированной на документы, для нашего приложения, потому что Core Data поддерживает ее напрямую. Меня больше всего беспокоят накладные расходы разработчиков, которые у нас будут, если мы будем придерживаться нашей нынешней парадигмы, не основанной на документах.

Есть ли у вас какие-либо советы или идеи, как приложения для обувных коробок должны быть интегрированы в новый мир Lion?


person Rafael Bugajewski    schedule 31.07.2011    source источник
comment
Что такое приложение в стиле обувной коробки?   -  person TechZen    schedule 31.07.2011
comment
Обувная коробка или библиотечное приложение — это приложение, которое хранит все ваши данные в одном окне вместо использования нескольких документов. Хорошими примерами приложений в стиле обувной коробки являются iPhoto, iTunes; хорошими примерами приложений для работы с документами являются Pages или Keynote. Хотя iTunes и iPhoto являются приложениями из коробки для обуви, они по-прежнему работают с «библиотекой», которая сама по себе является документом, и вы можете переключаться между различными библиотеками.   -  person Rafael Bugajewski    schedule 01.08.2011


Ответы (1)


Боюсь, вы вынуждены использовать первый вариант. Версии реализованы внутри NSDocumentController *sic*, поэтому вам придется использовать какой-то NSDocument, чтобы получить что-либо из версий. Я думаю, что вам также нужно добавить окно вашего приложения в NSWindowController к этому документу, чтобы получить красивое маленькое всплывающее меню вверху. Проблема в том, что версии - это более или менее совершенно непрозрачная функция...

Но есть вопрос, на который вы должны ответить сами: какие части вашего приложения вы хотели бы включить в версию? Имеет ли смысл хранить все в одном файле, когда речь идет о восстановлении данных? Восстановление версии (кроме копирования и вставки) происходит на уровне файловой системы. И, таким образом, действительно ли есть смысл всегда восстанавливать все сразу? Если ваш ответ отрицательный, вам, вероятно, даже придется разбить модель на несколько файлов меньшего размера...

Не ожидайте улучшения здесь до следующего крупного релиза. Это то, что я догадался из комментариев инженеров...

person Max Seelemann    schedule 31.07.2011
comment
+1 Управление версиями имеет смысл только в контексте документов, в которых один и тот же контент со временем развивается. Нет смысла иметь разные версии универсального хранилища базы данных, потому что обычно требуется фиксировать только текущее состояние данных. В базе данных новая версия почти всегда рассматривается как новые данные. Если вам нужно что-то вроде управления версиями в базе данных, вы проектируете его в самой модели данных, потому что это редко бывает так просто, как ввод данных в разное время, как в случае управления версиями документа. - person TechZen; 31.07.2011
comment
@Max: вы также можете использовать NSFileVersion и создать свой собственный пользовательский интерфейс для версий, но вы не получите модный пользовательский интерфейс Time Machine, к которому привыкли все люди. Я не думаю, что пользователям будет выгодно с точки зрения UX, если каждое приложение будет иметь свой собственный пользовательский интерфейс. Существует также проблема, заключающаяся в том, что NSPersistentDocument поддерживает сохранение на основе записей для моделей Core Data на основе SQLite. Для меня это выглядит так, как будто реализация не закончена, потому что естественное развитие будет заключаться в том, что версии также будут поддерживать модификации на основе записей (вместо файлов). Разделить модель не получится (Shoebox). - person Rafael Bugajewski; 01.08.2011
comment
@TechZen: Да, в основном вы правы. Но тогда что такое документ? Вы можете иметь документы на основе основных данных внутри NSFileWrapper, которые по-прежнему содержат полную модель со вспомогательными файлами. Если мы возьмем пример из книги, где вы проводите черту? Является ли каждый документ книгой с главами внутри или документ представляет собой библиотеку, в которой хранятся разные книги, и у вас есть отдельные библиотеки, такие как исследовательские, забавные, комиксы? Core Data — это не база данных, и API-интерфейсы не позволяют вам взаимодействовать с вашими моделями, как с классическими базами данных. Кроме того, в NSPersistentDocument и iCloud уже есть поддержка CD на основе записей. - person Rafael Bugajewski; 01.08.2011
comment
@Rafael - это не имеет ничего общего с форматом файла. Разделительной линией здесь является степень детализации, с которой сохраняются изменения. Приложение базы данных сохранит очень тонкие изменения, например. изменение одного имени из тысяч в базе данных. Приложение, основанное на документах, будет сохраняться только большими кусками, например. сохранение тысяч слов, добавленных в текстовый документ. Мелкая детализация приложения БД делает управление версиями, а затем весь файл хранилища довольно глупым, потому что, чтобы быть полезным, вам придется создавать новую версию каждый раз, когда вы меняете пару байтов. - person TechZen; 02.08.2011
comment
Я поддерживаю мнение TechZen: вы все еще можете разделить модель на отдельные фрагменты, каждый из которых хранится отдельно, используя эффективный механизм сохранения основных данных. Кстати: с CoreData и SQLLite, я уверен, что большинство операций записи в любом случае перезаписывают весь файл, даже если изменяется только одна запись... - person Max Seelemann; 08.08.2011