これが古い問題であることは知っていますが、私はこの問題に長い間苦しんでおり、その理由を発見したばかりです。
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:
に実行することで、最終的にこの問題を一気に解決しました。