12

ドキュメントによると、NSBundleResourceRequest を介してダウンロードされた iOS 9 オンデマンド リソースendAccessingResourcesは、 が呼び出されるまで保持され、リソース リクエスト オブジェクトが deallocated になると自動的に呼び出されます。

わかりましたが、アプリが終了すると、すべての割り当てが解除されます。これは、NSBundleResourceRequest を使用してダウンロードしたリソースが、アプリの終了後も存続しないということですか? 私は、多くのリソースを含めずに App Store からダウンロードできるようにアプリを小さくし、後でダウンロードするという単純な戦略を使用したいと考えていました。しかし、それらのリソースを保持できなければ、それはうまくいきません。リソースを別の場所にコピーして、NSBundleResourceRequest を解放する必要がありますか?

4

2 に答える 2

8

質問の最後の文で示唆されていることを正確に実行することになりました。リソースが到着したら、それらを Application Support フォルダーにコピーし、NSBundleResourceRequest を解放します。

これはオンデマンド リソースの精神に多少反するように思えますが、私の意見では、その精神は間違った精神です。この機能はあまり実用的な方法で設計されていません。

于 2015-10-13T18:07:18.857 に答える
7

するとendAccessingResources、アセットはパージの対象になります (保持を保持している他のリクエストがない場合)。ただし、ODR のドキュメントを読んでも、アセットがデバイスからすぐに削除されるとは限りません。

関連するすべてのタグがリクエストによって保持されなくなった場合、アセット パックはパージの対象となります。タグに関連付けられたリソースは、アプリの起動時など、削除されるまでしばらくデバイスに残る場合があります。

そのため、OS がスペースを解放する必要があると判断したかどうかによって、リソースはアプリの終了後も存続し、次にアプリを開いたときにも存在する可能性があります。を使用conditionallyBeginAccessingResourcesWithCompletionHandlerしてリソースにアクセスすると、リソースがまだデバイス上にあるかどうかを示すブール値が返されます。そうであれば、すぐに使い始めることができます。そうでない場合は、でダウンロードを開始できますbeginAccessingResourcesWithCompletionHandler

リソースが常にそこにあることを保証したい場合は、最初のダウンロードに含めることができます。または、確実に ODR を使用する場合は、ダウンロードしたリソースのコピーを別の場所に作成して永続化する必要があります。

ただし、リソースのコピーを作成すると、デバイス上に 2 つのコピーが作成される可能性があります。1 つはコピーして永続化し、もう 1 つは OS がまだ削除していません。すべての ODR リソースをコピーした後、少なくとも OS がアセットをパージする必要があると判断するまで、最初のダウンロードですべてをコピーした場合の 2 倍のスペースをアプリが占有する可能性があります。

tvOS で ODR を使用すると、OS はアセットをキャッシュに保持しようとするようです。そのため、アプリを次に使用するときに、再ダウンロードする必要なく、できるだけ多くのデータが残っています (複雑なアルゴリズムが存在する可能性があります)。ユーザーが近い将来再びアプリを使用する可能性を判断する背景)。「できるだけ多くのデータをキャッシュに保持する」というこのアプローチは、アプリがアセットを他の場所に永続化しない場合には優れていますが、アプリがアセットをコピーして永続化を保証しようとしている場合には、少し不必要に思えます。

最終的に、メモリに問題がある場合、キャッシュは自動的に消去されます。したがって、ユーザーがアプリを予想よりも大きく見える可能性があるのは表面的な問題にすぎず、その後のある時点で魔法のように小さくなります。 .

于 2015-11-04T19:38:28.010 に答える