【发布时间】:2018-11-12 04:24:42
【问题描述】:
我已经花了几天时间尝试寻找或自己弄清楚如何在通知 UIDocumentStateChangedNotification 触发且文档状态发生变化时以编程方式合并 UIDocument 更改UIDocumentStateInConflict 设置。
我能找到的所有示例(Apples、Ray Wenderlich 等)都详细说明了提示用户选择版本 方法。 我找不到任何演示以编程方式合并的正确方法。 这让我担心,因为它让我认为它太不稳定而无法信任并且通常被避免作为解决方案? 到目前为止,我在这方面的经验加强了这一立场。
让我详细说明我尝试中的每个问题区域。
1) 为了合并的目的,读取当前文档内容和 NSFileVersion 冲突版本的正确方法是什么? 使用任何带有完成块的东西在同步时真的很麻烦。 UIDocument 的 openWithCompletionHandler: 不值得使用。 事实上,作为一项规则,只读 UIDocument 的推荐方法是什么?为什么打开文档只是为了阅读? 我尝试使用 UIDocument 的 readFromURL:,这对于当前文档来说很好,但如果我尝试在任何 NSFileVersion 上使用它的 冲突版本它读取当前版本,而不是 URL 上的版本(我使用 MacOS 终端深入挖掘 ../data/.DocumentRevisions-V100/PerUID/... 文件以确认这一点。)。 对于冲突版本,它对我有用的唯一方法是直接读取访问这些文件。 (例如 NSData initWithContentsOfFile:)
2) 一旦读入文件的变体,并设法合并,如何正确保存合并? 这个在我能找到的任何地方都没有记录。 我成功的唯一方法是重新使用 NSFileVersion 的冲突文件之一,覆盖它,然后使用 UIDocument 的 replaceItemAtURL: 使其成为最新的。 在使用 replaceItemAtURL: 之后,我还尝试使用 UIDocument 的 revertToContentsOfURL:,但它只是在没有给出任何理由的情况下崩溃。由于没有它合并似乎可以正常工作,因此我并不担心,但我认为我会将其作为细节包含在内。
3) iPhone/iPad 模拟器 (V10.0) 在我重新启动应用程序之前不会通知冲突。这是可以预料的还是我做错了什么?我问是因为在模拟器的 Debug 菜单下有 Trigger iCloud Sync 可以同步,但在下次应用重新启动之前不会标记冲突。这只是模拟器的限制吗?
谢谢,
【问题讨论】:
标签: ios icloud uidocument icloud-documents