IPhoneでは、NSURLRequestを使用してデータのチャンクに対してHTTPリクエストを実行します。オブジェクトの割り当てが急増し、それに応じてデータを割り当てます。データを使い終えたら、それに応じてデータを解放します-ただし、データが解放されたことを示す機器は表示されません!
私の理論では、デフォルトでHTTPリクエストはキャッシュされますが、iPhoneアプリにこのデータをキャッシュさせたくありません。
リクエスト後にこのキャッシュをクリアする方法や、そもそもデータがキャッシュされないようにする方法はありますか?
私は以下のように少し文書化されたすべてのキャッシュポリシーを使用してみました:
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
theRequest.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
しかし、何もメモリを解放しないようです!
通常、このようなリクエストを作成する方が簡単です
NSURLRequest *request = [NSURLRequest requestWithURL:url
cachePolicy:NSURLRequestReloadIgnoringCacheData
timeoutInterval:60.0];
次に、接続を作成します
NSURLConnection *conn = [NSURLConnection connectionWithRequest:request
delegate:self];
そしてデリゲートにconnection:willCacheResponse:メソッドを実装します。単にnilを返すだけでそれができます。
- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse {
return nil;
}
Twitterから情報を要求したときに、アプリに同じ問題があります。私の場合、これらの資格情報を保持する必要はなかったので、次のコードを使用して単純にそれらを消去します。
- (void) eraseCredentials{
NSURLCredentialStorage *credentialsStorage = [NSURLCredentialStorage sharedCredentialStorage];
NSDictionary *allCredentials = [credentialsStorage allCredentials];
//iterate through all credentials to find the Twitter Host
for (NSURLProtectionSpace *protectionSpace in allCredentials)
if ([[protectionSpace Host] isEqualToString:@"Twitter.com"]){
//to get the Twitter's credentials
NSDictionary *credentials = [credentialsStorage credentialsForProtectionSpace:protectionSpace];
//iterate through Twitter's credentials, and erase them all
for (NSString *credentialKey in credentials)
[credentialsStorage removeCredential:[credentials objectForKey:credentialKey] forProtectionSpace:protectionSpace];
}
}
私はそれが誰かのために働くことを願っています:)
NSURLConnectionを使用する場合、デリゲートを見てください。
- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse
戻り値
キャッシュに保存する実際のキャッシュされた応答。デリゲートは、変更されていないcachedResponseを返すか、変更されたキャッシュされた応答を返すか、接続に対してキャッシュされた応答を保存する必要がない場合はnilを返します。
NSURLSession
を使用している場合、アプリのCaches
ディレクトリ内にiOSが作成するCache.db
にリクエストとパラメーターが書き込まれないようにする別のソリューションは、セッションの構成のNSURLCache
を0サイズのメモリと0サイズのディスクキャッシュ例.
let configuration = URLSessionConfiguration.default
configuration.urlCache = URLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil)
let session = URLSession(configuration: configuration)
または、前述のようにグローバルキャッシュレベルで設定
URLCache.shared = URLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil)
IOSのディスクへの書き込みを停止するのはおそらくディスクサイズの0ですが、reloadIgnoringLocalCacheData
に対するポリシーがある場合は、おそらくメモリキャッシングにも関心がないでしょう。
注これにより、Caches/Cache.db
(要求と応答)またはCaches/fsCachedData/
フォルダー(応答データ)がまったく作成されなくなります。リクエストをディスクキャッシュに保存したくないので、セキュリティの目的でアプリでこのアプローチを採用することにしました。
リクエストのキャッシュのみを停止し、iOS URL Loadingメカニズムからの応答データのキャッシュを保持する方法があることを誰かが知っている場合、知りたいと思います。 (これに関するAPIまたは公式文書はありません)
単一のリクエストに固有でない場合(アプリ全体のキャッシュを無効にする必要がある場合)は、1つ以下が最適なオプションです。このコードをアプリデリゲートに追加するか、必要に応じて
int cacheSizeMemory = 0*4*1024*1024; // 0MB
int cacheSizeDisk = 0*32*1024*1024; // 0MB
NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:cacheSizeMemory diskCapacity:cacheSizeDisk diskPath:@"nsurlcache"];
[NSURLCache setSharedURLCache:sharedCache];
NSMutableURLRequest* request = [[NSMutableURLRequest alloc] url];
[request setValue:@"no-store" forHTTPHeaderField:@"Cache-Control"];
[request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
サーバーが正しく実装されていると仮定すると、Cache-Control:no-store
ヘッダーをリクエストに含めると、同じヘッダーを持つサーバー応答が生成され、NSURLCache
が応答データをディスクに保存しなくなります。
したがって、NSURLCache
ディスクキャッシュを無効にするショットガンアプローチは不要です。
PS:ヘッダーの追加は、AFNetworking
などのすべてのHTTPフレームワークで機能するはずです