É possível evitar uma NSURLRequest de cache de dados ou remover dados em cache sequência de um pedido?
-
03-07-2019 - |
Pergunta
iPhone, eu executar uma solicitação HTTP usando NSURLRequest para um bloco de dados. picos de alocação de objetos e atribuir os dados em conformidade. Quando eu terminar com os dados, eu libertá-lo nesse sentido - no entanto instrumentos não mostra nenhum dado ter sido libertado
!A minha teoria é que, por padrão HTTP solicitações são armazenados em cache, no entanto - Eu não quero que meu iPhone app para armazenar esta informação.
Existe uma maneira de limpar esse cache depois de um pedido ou evitar que os dados sejam armazenados em cache em primeiro lugar?
Eu tentei usar todas as políticas de cache documentados um pouco como abaixo:
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
theRequest.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
mas nada parece liberar a memória!
Solução
Geralmente é mais fácil criar o pedido como este
NSURLRequest *request = [NSURLRequest requestWithURL:url
cachePolicy:NSURLRequestReloadIgnoringCacheData
timeoutInterval:60.0];
Em seguida, crie a conexão
NSURLConnection *conn = [NSURLConnection connectionWithRequest:request
delegate:self];
e implementar a conexão: willCacheResponse: método no delegado. Apenas retornando nil deve fazê-lo.
- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse {
return nil;
}
Outras dicas
Eu tenho o mesmo problema em meu aplicativo quando solicitado informações do twitter. No meu caso eu não tinha necessidade de preservar essas credenciais, então eu simples apagá-los usando o seguinte código:
- (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];
}
}
Espero que funcione para alguém:)
Se você usar NSURLConnection dar uma olhada o delegado:
- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse
Valor de retorno
A resposta em cache real para armazenar em cache. O delegado pode retornar cachedResponse inalterado, retornar uma resposta em cache modificados ou nulo retorno se não houver resposta em cache deve ser armazenado para a conexão.
Se não é específico para um único pedido (U quer desativar cache para aplicativo inteiro) abaixo é o melhor option.Add este código na delegado aplicativo ou com base em ur necessidade em qualquer lugar
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];
Se você estiver usando NSURLSession
, outra solução para evitar a solicitação e parâmetros sendo gravados no Cache.db
iOS cria dentro do diretório Caches
do aplicativo, é definir o NSURLCache
para configuração da sessão para um Memória 0 tamanho e 0 tamanho cache de disco por exemplo
let configuration = URLSessionConfiguration.default
configuration.urlCache = URLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil)
let session = URLSession(configuration: configuration)
ou como mencionado acima set em um nível cache global
URLCache.shared = URLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil)
Provavelmente é a 0 para o tamanho do disco que pára iOS escrita para o disco, mas se você tem uma política para reloadIgnoringLocalCacheData
então você provavelmente não está interessado em cache de memória também.
Nota ??strong> Isso irá evitar qualquer Caches/Cache.db
pasta Caches/fsCachedData/
(dados de resposta) (pedidos e respostas) ou que está sendo criado em tudo. Nós decidimos tomar essa atitude em um aplicativo para fins de segurança como nós não queremos que nossos pedidos sejam armazenados no cache de disco nunca.
Se alguém sabe é que há uma maneira de parar única caching pedido, mas manter o cache de dados de resposta do Mecanismo de carregamento iOS URL, eu estaria interessado em saber. (Não há nenhuma API ou documentação oficial sobre isso do que eu posso dizer)
NSMutableURLRequest* request = [[NSMutableURLRequest alloc] url];
[request setValue:@"no-store" forHTTPHeaderField:@"Cache-Control"];
[request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
Assumindo que o servidor seja correctamente aplicada, colocando o cabeçalho Cache-Control:no-store
no pedido irá gerar uma resposta do servidor com o mesmo cabeçalho, causando assim NSURLCache
para não armazenar os dados de resposta no disco.
Portanto, não há necessidade para a abordagem de espingarda de desabilitar o cache de disco NSURLCache
.
PS: Adicionando o cabeçalho deve funcionar para todos os frameworks de HTTP, como AFNetworking