是否有可能阻止NSURLRequestcaching数据或删除请求后的caching数据?

在iPhone上,我使用NSURLRequest为大块数据执行HTTP请求。 对象分配尖峰,我相应地分配数据。 当我完成数据的时候,我相应地将其释放 – 但是仪器没有显示任何数据被释放!

我的理论是,默认HTTP请求被caching,但是 – 我不希望我的iPhone应用程序caching这些数据。

有一种方法可以在请求之后清除这个caching,或者阻止任何数据被caching吗?

我已经尝试使用所有的caching策略logging在一点如下:

NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]]; theRequest.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData; 

但似乎没有任何东西释放内存!

通常这样创build请求更容易

 NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:60.0]; 

然后创build连接

 NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self]; 

并在委托上实现连接:willCacheResponse:方法。 只是返回零应该做到这一点。

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

返回值

实际caching的响应存储在caching中。 委托可以未修改地返回cachedResponse,返回一个修改后的caching响应,或者如果连接不存储caching响应,则返回nil。

如果不是特定于单个请求(U要禁用整个应用程序的caching)下面是最好的select。添加此代码在应用程序委托或根据您的需要任何地方

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

如果你使用的是NSURLSession ,另一个解决scheme是防止请求和参数被写入Cache.db iOS,在应用程序的Caches目录中创build,就是将会话configuration的NSURLCache设置为0大小的内存和0大小的磁盘caching。

 let configuration = URLSessionConfiguration.default configuration.urlCache = URLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil) let session = URLSession(configuration: configuration) 

或者如上所述设置在全局caching级别

 URLCache.shared = URLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil) 

据推测,这是磁盘大小0,停止iOS写入磁盘,但如果你有一个政策reloadIgnoringLocalCacheData那么你可能不会对内存caching感兴趣。

注意这会阻止Caches/Cache.db任何Caches/Cache.db (请求和响应)或Caches/fsCachedData/文件夹(响应数据)。 我们已经决定采取这种方法在应用程序出于安全的目的,因为我们不希望我们的请求被存储在磁盘caching永远。

如果有人知道是有办法停止请求caching但保持从iOS URL加载机制caching响应数据,我有兴趣知道。 (没有关于这个我可以告诉的API或官方文档)

 NSMutableURLRequest* request = [[NSMutableURLRequest alloc] url]; [request setValue:@"no-store" forHTTPHeaderField:@"Cache-Control"]; [request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData]; 

假设服务器被正确的实现,把Cache-Control:no-store头放在请求中会产生一个带有相同头的服务器响应,从而导致NSURLCache不把响应数据存储在磁盘上。

因此,不需要使用霰弹枪方法来禁用NSURLCache磁盘caching。

PS:添加头文件应该适用于所有的HTTP框架,比如AFNetworking