0

我正在设计一种基于打包的 NSDocument 文件格式。该文档将包含许多目录和文件,因此我想保存一个缓存,或者作为文档的一部分,或者在应用程序的 Caches 目录中。

缓存将是一个简单的 plist 数组。

我想设计这个,以便可以通过 Dropbox 或 iCloud 同步文档。所以我遇到了一个难题……缓存失效。

如果我将缓存存储在文档包中,如果文档同时在两台机器上编辑,其中一台可能会覆盖另一台的缓存,或者它们可能需要解决冲突。

如果我将缓存存储在外部缓存目录中,可能基于文档名称或文件标识符命名,我需要一些方法来检测如果文档在其他地方更新(通过同步甚至只是从电子邮件复制的较新版本)它是陈旧的)。

外部缓存也有其他问题,例如我考虑在文档中存储 UUID 并将其用作缓存文件名,但如果文档重复,缓存将被两个文档使用,这显然是错误的被编辑。

在我看来,最安全的地方是在文档包中,但随后又回到了可能的冲突。

我还想知道如何检测变化。一个过于复杂的想法是每次保存时将一个以 UUID 命名的文件写入文档中的文件夹,然后如果那里的文件数量发生变化,则重建缓存。(更简单的方法是文档中的更改计数,但如果两台机器同时增加计数并保存,这可能会导致冲突,请记住可能存在同步延迟。)

在我看来,安全同步文档包并不是一个不常见的问题,所以我希望有人可以提供一些最佳实践建议?

4

2 回答 2

1

使用 Dropbox,您会遇到无法自动更改文档包的问题。也就是说,如果保存您的文档涉及更改 N 个文件,然后再次保存涉及更改 M 个不同的文件,Dropbox 将按照它想要的任何顺序同步这些 N+M 个更改的文件,您无法判断一个文档级别的保存在哪里结束,而下一个开始,或者您当前是否看到完整的保存或一些中间值,其中您有一些更新的文件但还没有看到其他文件。

iCloud 知道文档包,但至少现在,您偶尔会看到虚假的冲突或“进入云端”的更改,并且似乎迷失了方向,再也不会回来了。调试这类情况非常非常困难。

于 2013-03-17T01:02:39.503 回答
0

不要将缓存存储在文档包中。您应该将其存储在 Caches (NSCachesDirectory) 目录中。

要安全地将缓存与文档关联,您可以创建基于文档的文件系统路径的缓存文件名。例如,通过创建作为路径哈希的后缀。这意味着如果文档被移动(在您的应用程序之外),则必须重新创建缓存 - 但这似乎是一个合理的权衡。

Xcode 将项目相关文件缓存在一个目录DerivedData/<project name>-<identifier>中。如果您查看该目录,您会发现一个包含 Xcode 项目路径的 info.plist 文件 - Xcode 可能使用它来验证缓存是否属于该项目。奇怪的是,有人对 Xcode 用来创建标识符的函数进行了逆向工程,并将其发布在此博客上:https ://pewpewthespells.com/blog/xcode_deriveddata_hashes.html 。

于 2016-06-02T15:45:57.347 回答