3

データをキャッシュしないオプションはNSDataReadingUncachedです。

しかしdataWithContentsOfURL、(セルごとに1つの画像)のURLから画像を更新するために使用しUITableViewCell、シミュレーター用のMacのアクティビティモニター(iOS 5.1シミュレーターとして実行)を見ると、ネットワークトラフィックは最大12kb/sにジャンプしますテーブルを上下に連続してスクロールしたときの受信率。上下のスクロールを停止すると、ネットワークアクティビティが約2kb/sの受信速度以下に低下します。これらの画像はそれぞれ20kb程度と非常に小さく、上下にスクロールすると、1つまたは2つの画像が消えたり表示されたりするだけなので、キャッシュがある場合でも、大きくする必要はありません。

dataWithContentsOfURLしたがって、データをキャッシュしないように見えます。オプションを使用dataWithContentsOfURL:options:error:してオプションが0ないことを意味する場合でも、ネットワークアクティビティは約12kb/sに跳ね上がります。

では、データをキャッシュしますか?そうでないdataWithContentsOfURL場合、なぜdataWithContentsOfURL:options:error:データをキャッシュしないオプションがあるのですか?

以下も実行されます。

[[NSURLCache sharedURLCache] setMemoryCapacity:1024*1024*10];

しかし、viewDidLoadネットワークレートはまだ上昇します。通常の推奨事項は、キャッシングが必要な場合はを使用することNSURLConnectionですが、何らかの理由で、NSURLConnectionAppleのドキュメントのリファレンスでは、サンプルプロジェクトについて言及されている場合を除いて、「キャッシュ」または「キャッシング」という単語はまったく表示されません。 「URLCache」と呼ばれますが、キャッシュについてはまったく言及されていません。

4

1 に答える 1

9

ここでは、ファイルシステムキャッシュとネットワークキャッシュの2つの異なるキャッシュについて説明しています。

dataWithContentsOfURL:options:error:( )に渡すことができるフラグはNSDataReadingUncached、前者を参照します。これは、読み取っているデータが1回だけ読み取られるため、キャッシュに残る必要がないことを示唆しています。URLから読み取るため、ここでファイルシステムキャッシュがまったく関係していないことに驚かれるかもしれませんが、URLがファイルURLである可能性があることに注意してください。この場合、読み取りはディスクから生成されるのではなく、ディスクから行われます。ネットワークリクエスト。

他のタイプのキャッシュであるネットワークキャッシュに関しては、NSData便利な方法を使用してURLのコンテンツをロードするときにキャッシュを使用するかどうかはわかりませんが、使用しません。その動作には、NSURLConnection前述のように、のような低レベルのAPIを使用する必要があります。このレベルでHTTPキャッシュを利用するには、サーバーがリソースの有効期間を示す適切なヘッダーを送信する必要があることに注意してください。それ以外の場合、要求は、リソースが変更されたという悲観的な仮定の下で行われます。iOSでは、 /ヘッダーが受信された場合、シートの下でNSURLConnection自動的に使用されます。NSURLCacheExpiresCache-Control

補足:を使用する場合NSURLConnectionは、接続ではなく、接続でNSURLRequestリクエストを行うために使用するオブジェクトにキャッシュポリシーを設定します。したがって、詳細を確認するには、のリファレンスNSURLRequestとその同類を調べる必要があります。

上記のいずれも適切でない場合は、独自のキャッシュスキームをロールするか、最初NSURLCacheから直接使用することができます。iOS 5以降、NSURLCacheディスクキャッシングの使用とdiskCapacityプロパティの尊重が開始され、以前よりもさらに強力になりました。これは、HTTPサーバーが指示している以上に、リソースが最新の状態を維持する期間について、ある種の帯域外の知識がある場合に最適な方法です。

于 2012-08-24T03:33:18.157 に答える