2

デバイスがオンラインのときに変更が行われると、iCloud デーモンは数秒以内に変更を iCloud サーバーにアップロードするようです。ただし、変更がローカルの iCloud コンテナーに対してオフラインで行われ、デバイスがオンラインになると、iCloud デーモンが変更をアップロードするタイミングに一貫性がないことに気付きました。接続を再確立した後、変更が iCloud サーバーにアップロードされ、他のデバイスによって検出されるまでに、数秒から 30 分の遅延が発生しました。これは正常ですか?iCloudデーモンにアップロードを強制するように指示する方法はありますか?

UIDocument のサブクラス (作成、開く、変更、iCloud コンテナーへのファイルの保存) と NSMetadataQuery のみを使用して、変更を検出します。オンラインに戻った後、キー NSURLUbiquitousItemIsUploadedKey のファイル ステータスは false であり、長時間そのままになる可能性があります。ファイルを再保存して、iCloud デーモンに変更を強制的にアップロードさせようとしましたが、効果がないようです。

4

1 に答える 1

0

これが古い問題であることは知っていますが、私はこの問題に長い間苦しんでおり、その理由を発見したばかりです。

NSURL のgetResourceValue:forKey:error:メソッドを使用すると、NSURLが非常に特殊な状況下でリソース値をキャッシュするため、ファイルが明らかにアップロードされていないNSURLUbiquitousItemIsUploadedKeyことがわかります。

メイン ドキュメントのどこにも言及されていませんが、NSURL.h に飛び込むと、次の奇妙なフレーズの宝石が見つかります。

リソース値のキャッシュの動作は、NSURL API と CFURL API の間でわずかに異なります。

キャッシュされたリソース値を取得、設定、または使用する NSURL メソッドがメイン スレッドから使​​用される場合、URL によってキャッシュされたリソース値 (一時プロパティとして追加されたものを除く) は、次にメイン スレッドの実行ループが実行されるときに無効になります。

CFURL 関数は、URL によってキャッシュされたリソース値を自動的にクリアしません。クライアントは、キャッシュの有効期間を完全に制御できます。CFURL API を使用している場合は、CFURLClearResourcePropertyCacheForKey または CFURLClearResourcePropertyCache を使用して、キャッシュされたリソース値をクリアする必要があります。

指定されたリソース キーによって識別されるリソース値を返します。このメソッドは、最初に URL オブジェクトがすでにリソース値をキャッシュしているかどうかを確認します。その場合、キャッシュされたリソース値を呼び出し元に返します。そうでない場合、このメソッドはバッキング ストアからリソース値を同期的に取得し、リソース値を URL オブジェクトのキャッシュに追加して、リソース値を呼び出し元に返します。リソース値のタイプは、リソース プロパティによって異なります (リソース キーの定義を参照してください)。このメソッドが YES を返し、値に nil が設定されている場合は、指定されたリソースでリソース プロパティを使用できず、リソース プロパティを使用できないと判断したときにエラーが発生しなかったことを意味します。このメソッドが NO を返す場合、オプションのエラーが設定されます。このメソッドは現在、ファイル システム リソースの URL にのみ適用できます。

基本的に、メイン スレッド以外のスレッドで getResourceValue: を使用すると、最初の結果がキャッシュされ、同じ結果が何度も返されます。直感的ですね。ヘッダーに埋められるのではなく、ドキュメントで大きな太字でフラグが立てられると思われる種類のもの...

私にとって、これは、デバイスが特定の URL がダウンロードされていないと思っていたため、実際には何年も前にダウンロードしていたのに、時折「固着」することで明らかになりました。アプリを再起動すると、問題が解決することがよくありました。メインスレッドのみで強制的getResourceValue:forKey:error:に実行することで、最終的にこの問題を一気に解決しました。

于 2013-08-18T00:15:06.113 に答える