是否有可能阻止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