É possível evitar uma NSURLRequest de cache de dados ou remover dados em cache sequência de um pedido?

StackOverflow https://stackoverflow.com/questions/405151

  •  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!

Foi útil?

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 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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top