web-dev-qa-db-ja.com

AFNetworkingキャッシュを無効にする方法

AFNetworkingからすべてのキャッシュ機能を無効にすることは可能ですか?

私は独自のカスタムキャッシュシステムを構築しており、これがディスク領域を占有することも望まない。

ありがとう、アシュリー

19
Ashley Staggs

キャッシュはNSURLCacheによってアプリケーション全体で処理されます。共有キャッシュを設定しない場合、リクエストはキャッシュされません。共有NSURLCacheを使用しても、iOSのデフォルト実装はディスクキャッシュをサポートしていません。

とは言っても、独自のキャッシュシステムを作成する特別な理由がない限り、私は強くそれをお勧めします。 NSURLCacheは99.9%のアプリケーションに十分対応できます。これは、着信応答からのキャッシュディレクティブを処理し、新しいリクエストで適切に使用し、アプリケーションのパフォーマンスボトルネックになる可能性が低い方法で自動的に行います。自分を作るのに何時間も無駄にしてしまった誰か(そして後でそれが完全に不要になったのでそれを捨てる)として、私ははるかに良いと思います開発の注意を集中させる場所。

25
mattt

最初はジェイソンムーアの答えが機能することを見つけましたが、最近、アプリがまだリクエストをキャッシュしていることに気付きました。私は最新のAFNetworkingを使用していないので、最近のビルドでキャッシュが対処されているかどうかはわかりません。

AppleのURLCacheプロジェクトはこう言っています:

デフォルトでは、Cocoa URLロードシステムは小さな共有メモリキャッシュを使用します。このキャッシュは必要ないため、アプリケーションの起動時にゼロに設定します。

そして、これを実行してキャッシュを無効にします。

NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0
                                                        diskCapacity:0
                                                            diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];
[sharedCache release];

これにより、アプリ全体のすべてのキャッシュが無効になります。これは状況によっては理想的ではないかもしれませんが、NSURLRequestは要求されたキャッシュポリシーを順守していないため、表示される唯一のオプションです。

25
addicted2oxygen

IOS 6で、リクエストにNSURLRequestReloadIgnoringCacheDataが含まれている場合でも、リクエストがキャッシュされることがあることがわかりました。 nilを返すキャッシュ応答ブロックを追加すると、リクエストがキャッシュされなくなります。

NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url
                                              cachePolicy:NSURLRequestReloadIgnoringCacheData
                                          timeoutInterval:20];
AFJSONRequestOperation *op =
[AFJSONRequestOperation JSONRequestOperationWithRequest:request];

// DISABLE CACHE //
[op setCacheResponseBlock:^NSCachedURLResponse *(NSURLConnection *connection, NSCachedURLResponse *cachedResponse) {
    return nil;
}];

[op start];
23
Jason Moore

残念ながら、これらの方法のどれも私にはうまくいきませんでした。キャッシュを無効にした唯一の方法は、次の方法です。

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager.requestSerializer setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];

これが元の答えです

10
JakubKnejzlik

これはサーバーの実装によって異なりますが、Cache-Control:no-storeヘッダーを送信リクエストに送信すると、同じヘッダーを含む応答が返されるため、NSURLCacheに応答をディスクにキャッシュしないように指示します。

IMHOこれは、特にNSURLCacheを利用する可能性のある他のアプリケーションで使用されるSDKコードを作成している場合は、ディスクキャッシュを完全に無効にするよりも優れたアプローチです。

0
Yuri Brigance
NSURLRequest *request = [NSURLRequest requestWithURL:URL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10];
0
chings228