Совместимы ли NSPersistentDocument и UIManagedDocument?

Я хотел бы создать NSPersistentDocument в Mac OS X и прочитать этот документ как UIManagedDocument в iOS 7.

Это возможно?

Оба формата файлов совместимы?

Спасибо!


person AlexR    schedule 25.09.2013    source источник


Ответы (2)


Интересный вопрос - я могу подтвердить, что основные файлы данных ядра совместимы. У меня есть приложение для Mac и приложение для iOS, использующие один и тот же файл, который синхронизируется с помощью iCloud. Приложение представляет собой приложение, основанное на документах, и в настоящее время я храню фактический файл базы данных в iCloud, поэтому весь файл синхронизируется с iCloud.

Это работает нормально, но очевидно, что если пользователь открывает файл на двух устройствах и не заботится о сохранении и закрытии, есть вероятность, что его изменения могут быть отменены.

Apple одобрила приложение для Mac, которое использует стандартный NSPersistentDocument для создания и сохранения файлов. К сожалению, они отклонили приложения для iOS с какой-то неясной ссылкой на несоответствие их рекомендациям по хранению данных, заявив, что документы должны храниться в каталоге / Documents, если их необходимо создать резервную копию в iCloud. Что ж, если пользователь выбрал iCloud, я сохраняю файлы в расположении iCloud, предоставленном вызовами API.

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

Если я попытаюсь использовать UIManagedDocument, iOS создаст структуру папок и сохранит базу данных внутри этой структуры папок. Затем в диалоговом окне «Файл-> Открыть» приложения Mac отображается эта структура папок, а также файл, который по сути выглядит как обычный файл sqlite. Но тогда, возможно, OS X 10.8.4 не реализует новейший материал iCloud/Core Data — кто знает…

РЕДАКТИРОВАТЬ Вот ссылка на примеры кода и видео, демонстрирующие интеграцию приложений OSX и iOS с использованием Core Data и iCloud. http://ossh.com.au/design-and-technology/software-development/uimanageddocument-icloud-integration/

person Duncan Groenewald    schedule 03.10.2013
comment
И ваше приложение для iOS, и для OS X должно хранить документы iCloud в <iCloudContainerPath>/Documents вы, скорее всего, храните свои файлы на корневом уровне контейнера, поскольку это путь, который вы получаете по умолчанию. Все, что находится на этом уровне, не может быть удалено таким же тонким прикосновением, как элементы на уровне /Documents (либо все, либо ничего). Если вы создаете приложение для обуви, в котором нет документов, есть только одно хранилище больших данных, которое хранится на корневом уровне контейнера. - person theMikeSwan; 04.01.2014

Я согласен, что это определенно возможно. Я использую документ NSPersistent в OS X 10.8/10.9/10.10 с двоичным форматом данных ядра (без оберток - простые файлы). В iOS я использую UIDocument. Базовые данные прекрасно работают в обеих средах.

Apple заявляет, что NSPersistentDocument не поддерживает iCloud. Правильнее будет сказать, что он полностью не поддерживается. Большая часть поддержки NSDocument (включая доступ к библиотеке документов iCloud из версии 10.8) будет работать. Обработка конфликтующих файлов на открытых работах.

Вы не можете включить автоматическое сохранение (которое указано в качестве требования для документов iCloud в Руководстве по дизайну iCloud). Автосохранение работает асинхронно и определенно не поддерживается NSPersistentDocument.

Поэтому, если вы справляетесь с сохранением файлов и конфликтами, можно использовать документ NSPersistent. Есть некоторые особенности: так, например, если изменение iCloud поступает в OS X для открытого документа, нормальным ответом NSDocument будет автоматическое повторное открытие документа. Этого не происходит — и нет предупреждения о том, что файл изменился, пока вы не собираетесь сохранить файл. Но по крайней мере есть предупреждение. В iOS легче обнаруживать изменения по мере их возникновения с помощью UIDocumentStateChangedNotification.

person Michael Rourke    schedule 11.09.2015
comment
можете ли вы распространять образцы проектов NSPersistentDocument и UIManagedDocument, взаимодействующие с одними и теми же документами Core Data? - person Tobe; 13.03.2019
comment
Привет @Тобе. Мне жаль, что нелегко дать вам образец проекта. Лучший совет, который я могу дать, — прочитать [ссылка] (developer.apple.com/library/archive/documentation/). Мне нужно было создать подкласс NSDocument и переопределить initWithType, readFromURL, saveDocument, saveDocumentWithDelegate, close и makeWindowControllers. Как только вы начнете создавать документы и создавать конфликты с хорошо оснащенным приложением, путь станет яснее. iOS проста в сравнении. - person Michael Rourke; 15.03.2019
comment
Привет @MichaelRourke, спасибо за интересную информацию. Является ли предлагаемое вами решение лучшим в 2020 году для синхронизации документов с основными данными между macOS и iOS через iCloud Drive? Спасибо! - person vomi; 07.03.2020
comment
привет @воми. Я не уверен, что это лучшее решение. Он работает, но полагается на обширное тестирование, чтобы убедиться, что различные пограничные случаи удовлетворены. Кроме того, использование атомарного хранилища данных означает, что вы не можете поддерживать независимые обновления записей. Если бы я начинал заново, я бы посмотрел на Cloudkit и попытался разработать настоящее кросс-платформенное решение. Мое приложение имеет низкую скорость изменений, поэтому ваш вариант использования будет определять лучший дизайн. - person Michael Rourke; 08.03.2020