Должен ли я использовать NSFileWrappers в UIManagedDocument?

Я пытаюсь сохранить plist и несколько двоичных файлов (скажем, изображений) как часть UIManagedDocument. Имя двоичных файлов является атрибутом в Core Data, и мне не нужно перечислять их, просто обращайтесь к нужному при отображении связанной сущности.

Файловая структура, которую я хочу иметь:

 - <File yyyyMMdd-HHmmss>.extdoc
   - StoreContent
     - persistentStore
   - AdditionalContent
     - ListStatus.plist (used to store per document defaults)
       - Images
         - uuid1.png
         - uuid2.png
         - ...
         - uuidn.png

До сих пор я успешно следовал инструкциям в Как сохранить дополнительный контент в мои файловые пакеты UIManagedDocument?, но когда я пытаюсь добавить двоичные файлы, есть некоторые вещи, которые я не знаю, как сделать.

  1. Должен ли я рассматривать URL / the / path / File yyyyMMdd-HHmmss.extdoc / AdditionalContent (по умолчанию, предоставленный readAdditionalContentFromURL:error:) как NSFileWrapper? Есть ли какие-либо преимущества / недостатки по сравнению с использованием только URL? Я считаю более сложным использование оболочки файлов, так как список должен быть прочитан с использованием средств доступа к оболочке файлов и NSCoder (я думаю), а также файлов, я должен сохранить оболочку файлов для каталога Images и затем получить соответствующий узел с objectForKey (я предполагаю). Но в Руководстве Apple по программированию на основе документов для iOS, касающемся пользовательских форматов вместо NSData или NSFileWrapper, говорится: " Имейте в виду, что ваш код должен будет дублировать то, что делает для вас UIDocument, и поэтому вы должны иметь дело с большей сложностью и большей возможностью ошибка ". Я неправильно понимаю это?
  2. Для каждого документа значения по умолчанию объявляются как свойства: установщик изменяет NSDictionary, который отображает plist и помечает документ как обновленный, а получатель обращается к словарю с соответствующим ключом. Как мне выставить возможность чтения / записи двоичных файлов? Должен ли я добавить метод в мой подкласс UIManagedDocument? - (void)writeImage:(NSString*)uuid; и -(UIImage *)readImage:(NSString *)uuid; И я должен хранить эти данные в памяти, пока документ не будет сохранен? Как?
  3. Предполагая, что NSFileWrapper - путь, если я планирую использовать этот документ с iCloud, я должен использовать файловые координаторы с оберткой файла? Если так, то как?

Любой исходный код для каждого вопроса будет принята с благодарностью. Спасибо.

PS: я знаю, что могу сохранить некоторые двоичные данные внутри Core Data, но я не чувствую себя комфортно с этим решением. Среди прочих причин я предпочитаю хранить данные PNG для файлов изображений, которые представляют собой сериализованную версию UIImage, которая не будет совместима с NSImage, если я хочу создать настольное приложение.

3 ответа

Я хотел бы сказать, что в целом мне больше нравится UIManagedDocument. Он имеет несколько преимуществ по сравнению с необработанными базовыми данными. Например, он автоматически настраивает весь стек данных ядра. Он также настраивает вложенные контексты управляемых объектов для вас, поэтому вы получаете бесплатное фоновое сохранение. Ничто из этого не является особенно потрясающим, но это большая функциональность из небольшого количества кода.

Я не играл с сохранением дополнительной информации... но вот мои мысли.

Во-первых, вам не нужно обрабатывать новый URL как оболочку файла. Вы должны просто иметь возможность выполнять обычные файловые операции с указанным URL. Просто убедитесь, что у вас все правильно реализовано в AdditionalContentForURL:error:, writeAdditionalContent:toURL:originalContentsURL:error: и readAdditionalContentFromURL:error:. Операции чтения и записи должны быть симметричными. И вам, вероятно, следует сделать снимок ваших данных в AdditionalContentsForURL:error: так, чтобы все было сохранено в известном хорошем состоянии (поскольку операции сохранения являются асинхронными).

В качестве альтернативы вы рассматривали возможность использования флага "Сохранить в файле внешней записи" в своей модели данных вместо его сохранения вручную? Это должно заставить Core Data (в зависимости от размера двоичных данных) автоматически сохранять их снаружи. Я посмотрел заметки о выпуске и не увидел ничего, что говорило бы, что вы не можете использовать эту функцию с iCloud. Это может быть самым простым решением.

Атака боковой точки на данный момент (так как у меня не было никакого хорошего опыта с UIManagedDocument).

Вы можете сохранить двоичный файл внутри Core Data для приложения iOS 5.0+, используя ссылку на внешний файл. Затем вы можете сохранить PNG изображения в Core Data напрямую, и вам не нужно беспокоиться о UIManagedDocument или о раздутии файла sqlite.

Ничто не мешает вам хранить PNG вместо UIImage.

Еще одна мысль. Возможно, вам придется использовать NSFileCoordinator для операций чтения и записи. Технически, любые операции чтения или записи в контейнере iCloud должны использовать файловый координатор (для координации со службой синхронизации iCloud - это предотвращает случайное повреждение файла при его чтении во время записи в него другого процесса).

Я знаю, что UIDocument автоматически оборачивает большинство своих методов ввода и вывода. Я предполагаю, что эти методы имеют одинаковую оболочку (так как они дают вам URL для использования)- однако, документы не очень понятны.

Другие вопросы по тегам