Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 用于打包文件格式设计的缓存_Macos_Cocoa_Package_Sync_Nsdocument - Fatal编程技术网

Macos 用于打包文件格式设计的缓存

Macos 用于打包文件格式设计的缓存,macos,cocoa,package,sync,nsdocument,Macos,Cocoa,Package,Sync,Nsdocument,我正在设计一个基于包的NSDocument文件格式。文档将包含许多目录和文件,因此我想保存一个缓存,作为文档的一部分,或者保存在应用程序的缓存目录中 缓存将是一个简单的plist数组 我想设计这样的文件可以通过Dropbox或iCloud同步。所以我遇到了一个难题。。。缓存失效 如果我将缓存存储在文档包中,如果文档同时在两台计算机上编辑,则其中一台可能会覆盖另一台计算机的缓存,或者它们可能需要冲突解决 如果我将缓存存储在external Caches目录中,可能是基于文档名或文件标识符命名的,我

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

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

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

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

如果我将缓存存储在external Caches目录中,可能是基于文档名或文件标识符命名的,我需要某种方法来检测文档在其他地方更新时是否过时(通过同步,甚至只是从电子邮件复制的较新版本)

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

在我看来,它最安全的地方是在文档包中,但随后又会出现可能的冲突

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


在我看来,安全地同步文档包并不是一个很少见的问题,因此我希望有人能提供一些最佳实践建议?

使用Dropbox,您将遇到无法自动更改文档包的问题。也就是说,如果保存文档涉及更改N个文件,然后再次保存涉及更改M个不同的文件,Dropbox将按照它想要的顺序同步这些N+M个已更改的文件,您无法分辨一个文档级保存的结束位置和下一个文档级保存的开始位置,或者您当前看到的是完整的保存,还是一些中间值,其中您有一些已更新的文件,但尚未看到其他文件


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

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

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


Xcode将项目相关文件缓存到目录
DerivedData/-
。如果查看该目录,您会发现一个info.plist文件,其中包含Xcode项目的路径——可能是Xcode用来验证缓存是否属于该项目的。奇怪的是,有人反向设计了Xcode用来创建标识符的函数,并发布在这个博客上:。

谢谢。同步当然很难。。。你会认为在2013年它会更好。我想对于Dropbox,每次更改后我都必须重新缓存。希望NSFilePresenter能够帮助跟踪运行时发生的更改。