UIDocument + NSFileWrapper + iCloud =奇怪的行为

时间:2016-07-04 10:04:48

标签: ios icloud uidocument nsfilewrapper

我正在尝试编写一个相当简单的基于UIDocument的应用程序,我希望每个文档的数据都是包含一些图像文件的父目录。 为了开始,我选择使用Apple的ShapeEdit样本,因为它似乎处理了在iCloud中拥有文件的大量复杂性。它只对文档数据使用单个plist文件。

作为第一步,我在我的iPad上启动并运行了ShapeEdit应用程序,一切都按预期工作。我的应用程序和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。最后,我将形状选择UI留在那里,用

触发文档更新
updateChangeCount(.Done)

这一切都很好。创建新文档会创建一个名为Untitled.shapeFile的新目录,它将显示在iCloud中。现在为奇数第一。如果我打开该文档并点击形状选择UI以触发更改并等待几秒钟,则会在iCloud中显示另一个Untitled.shapeFile目录。事实上,每次我这样做,我都会得到另一个。这些似乎只对iPad来说是本地的,因为我的Mac上的iCloud只有一个副本。删除iCloud Drive应用程序中的任何这些目录会导致删除所有这些目录。

对于下一步,我向UIDocument loadFromContents()函数添加了一些代码

fileWrapper?.addRegularFileWithContents(UIImagePNGRepresentation(image!)!, preferredFilename: "MYImage.png")

所以每次加载文档时,它都会将另一个图像文件添加到父目录。

首先,这完全符合我的希望。打开文档,点击形状选择UI,在Untitled.shapeFile中的iCloud Drive中看到MyImage.png文件。保持关闭和打开,我得到更多的MyImage.png文件,前面有一些垃圾,我认为是iCloud防止同名文件的方式,所以一切都很好。除了第二个奇怪的东西。在iCloud Drive中显示MYImage.png文件后不久,弹出另一个名为MyImage 2.png的文件。如果我继续关闭并打开所有版本的MyImage,也会获得一个带有2的副本。我编辑的ShapeEdit版本从不添加任何具有此名称格式的图像文件。这些额外的图像也会显示在Mac上,因此它们与主文档目录不同,是一个奇怪的幻像副本。

所以有两件事

1)为什么我会获得Untitled.shapeFile文档的多个副本,这些副本看起来实际上是同一个东西?

2)为什么我得到了我的图像文件的额外副本,添加了2我的应用程序从未与之相关的内容?

任何建议都欢迎之前,这会让我感到不满。

0 个答案:

没有答案