UIDocument + NSFileWrapper + iCloud = Странное поведение
Я пытаюсь написать довольно простое приложение на основе UIDocument и хочу, чтобы данные для каждого документа были родительским каталогом, содержащим некоторые файлы изображений. Для начала я решил использовать образец ShapeEdit от Apple, так как он, кажется, справляется со сложностью наличия файлов в iCloud. Он использует только один файл plist для своих данных документа.
В качестве первого шага я запустил приложение ShapeEdit и запустил его на своем iPad, и все работает как положено. У меня есть приложение и приложение iCloud Drive, работающие в режиме разделения на моем iPad, чтобы я мог видеть файлы, которые создает ShapeEdit. Как и ожидалось, каждый раз, когда я добавляю новый документ, в iCloud Drive появляется новый файл.
Чтобы перенести приложение ShapeEdit для использования большего количества файлов, я перешел на использование NSFileWrapper. Когда ShapeEdit создает новый документ, он копирует файл шаблона. Я изменил это, чтобы просто создать новую папку, используя
try fileManager.createDirectoryAtURL(writeIntent.URL, withIntermediateDirectories: false, attributes: nil)
Затем я изменил код UIDocument, чтобы он читался из NSFileWrapper следующим образом
override func loadFromContents(contents: AnyObject, ofType typeName: String?) throws {
guard let data = contents as? NSFileWrapper else {
fatalError("Cannot handle contents of type \(contents.dynamicType).")
}
fileWrapper = data
Я также поменял некоторые другие функции в документе, чтобы вернуть простое изображение для миниатюр, просто чтобы оно заработало, и установил для LSTypeIsPackage значение true. Наконец, я оставил там интерфейс выбора формы, чтобы запустить обновление документа
updateChangeCount(.Done)
Опять же все это прекрасно работает. При создании нового документа создается новый каталог с именем Untitled.shapeFile, который отображается в iCloud. Теперь о странности номер один. Если я открою этот документ и коснусь пользовательского интерфейса выбора формы, чтобы вызвать изменение и подождать несколько секунд, в iCloud появится другой каталог Untitled.shapeFile. На самом деле каждый раз, когда я делаю это, я получаю еще один. Они кажутся локальными только для iPad, хотя у iCloud на моем Mac есть только одна копия. Удаление любого из этих каталогов в приложении iCloud Drive приводит к удалению всех из них.
Для следующего шага я добавил немного кода в функцию loadFromContents() UIDocument
fileWrapper?.addRegularFileWithContents(UIImagePNGRepresentation(image!)!, preferredFilename: "MYImage.png")
поэтому каждый раз, когда документ загружается, он добавляет другой файл изображения в родительский каталог.
Начнем с того, что делает именно так, как я надеялся. Откройте документ, коснитесь пользовательского интерфейса выбора формы и просмотрите файл MyImage.png в iCloud Drive в Untitled.shapeFile. Продолжайте закрывать и открывать, и я получаю больше файлов MyImage.png с некоторым мусором спереди, что, как я полагаю, является способом iCloud для предотвращения файлов с одинаковыми именами, так что все в порядке. За исключением странной вещи номер два. Вскоре после того, как файл MYImage.png отображается в iCloud Drive, появляется другой файл под названием MyImage 2.png. Если я продолжаю закрывать и открывать все версии MyImage, также получаю копию с 2. Моя отредактированная версия ShapeEdit никогда не добавляет никаких файлов изображений с этим форматом имени. Эти дополнительные изображения также отображаются на Mac, поэтому они не являются такими же странными фантомными копиями, как основной каталог документов.
Итак, две вещи
1) Почему я получаю несколько копий документа Untitled.shapeFile, которые на самом деле выглядят одинаково?
2) Почему я получаю дополнительные копии файла изображения с добавлением 2, к которому мое приложение никогда не имело никакого отношения?
Любые предложения приветствуются, прежде чем это сводит меня с ума.
Спасибо
-Codeape