Должен ли я использовать NSFileWrappers в UIManagedDocument? - PullRequest
4 голосов
/ 29 февраля 2012

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

Структура файла, которую я хочу иметь:

 - <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 / / путь / файл yyyyMMdd-HHmmss.extdoc / AdditionalContent (по умолчанию предоставляется readAdditionalContentFromURL: ошибка :) как NSFileWrapper? Есть ли какие-либо преимущества / недостатки по сравнению с использованием только URL?Я считаю более сложным использование обертки файлов, так как plist должен быть прочитан с использованием средств доступа к оберткам файлов и 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 ]

1 голос
/ 08 марта 2012

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

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

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

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

0 голосов
/ 08 марта 2012

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

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

0 голосов
/ 29 февраля 2012

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

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

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

...