0

パッケージベースの NSDocument ファイル形式を設計しています。ドキュメントには多数のディレクトリとファイルが含まれるため、キャッシュをドキュメントの一部として、またはアプリケーションの Caches ディレクトリに保存したいと考えています。

キャッシュは単純な plist 配列になります。

ドキュメントを Dropbox または iCloud 経由で同期できるように、これを設計したいと考えています。だから私は難しい問題の1つに直面しています...キャッシュの無効化。

ドキュメント パッケージにキャッシュを保存した場合、ドキュメントが 2 台のマシンで同時に編集されると、一方が他方のキャッシュを上書きするか、競合の解決が必要になる可能性があります。

おそらくドキュメント名またはファイル識別子に基づいて名前が付けられた外部 Caches ディレクトリにキャッシュを保存する場合、ドキュメントが他の場所で更新された場合 (同期または電子メールからコピーされた新しいバージョンであっても)、古いものであることを検出する何らかの方法が必要です。 )。

外部キャッシュには他の問題もあります。たとえば、ドキュメントに UUID を保存し、それをキャッシュ ファイル名として使用することを考えましたが、ドキュメントが複製されている場合、キャッシュは 2 つのドキュメントで使用されます。編集されます。

最も安全な場所はドキュメント パッケージ内にあるように思えますが、競合が発生する可能性があります。

また、変化をどのように検出するかについても疑問に思いました。非常に複雑なアイデアの 1 つは、保存するたびに UUID 名のファイルをドキュメント内のフォルダーに書き込み、そこにあるファイルの数が変わった場合はキャッシュを再構築するというものでした。(より単純なアプローチはドキュメントの変更カウントですが、2 台のマシンがカウントをインクリメントして同時に保存すると、競合が発生する可能性があります。同期の遅延が発生する可能性があることを念頭に置いてください。)

ドキュメント パッケージを安全に同期することはそれほど珍しい問題ではないように思えます。

4

2 に答える 2

1

Dropboxを使用すると、ドキュメントパッケージをアトミックに変更する方法がないという問題が発生します。つまり、ドキュメントの保存にN個のファイルの変更が含まれ、次に再度保存する場合にM個の異なるファイルの変更が含まれる場合、DropboxはそれらのN + M個の変更されたファイルを任意の順序で同期し、1つのドキュメントレベルの保存がどこで終了するかを判断できません。次に開始したか、または現在完全な保存が表示されているか、更新されたファイルはあるが他のファイルはまだ表示されていない中間値が表示されているかどうか。

iCloudはドキュメントパッケージについて知っていますが、少なくとも今のところ、誤った競合や「クラウドに移行する」変更が時折見られ、迷子になって二度と戻ってこないように見えます。この種の状況をデバッグすることは非常に困難です。

于 2013-03-17T01:02:39.503 に答える
0

ドキュメント パッケージ内にキャッシュを保存しないでください。キャッシュ (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 に答える