Cocoa touch 是否可以阻止NSURLRequest缓存数据或在请求后删除缓存数据?

Cocoa touch 是否可以阻止NSURLRequest缓存数据或在请求后删除缓存数据?,cocoa-touch,caching,Cocoa Touch,Caching,在iPhone上,我使用NSURLRequest对数据块执行HTTP请求。对象分配峰值,我相应地分配数据。当我处理完数据后,我会相应地释放它-但是仪器不会显示任何已释放的数据 我的理论是,默认情况下HTTP请求是缓存的,但是,我不希望我的iPhone应用程序缓存这些数据 有没有一种方法可以在请求后清除此缓存,或者首先阻止缓存任何数据 我尝试过使用所有缓存策略,如下所示: NSMutableURLRequest *theRequest = [NSMutableURLRequest requestW

在iPhone上,我使用NSURLRequest对数据块执行HTTP请求。对象分配峰值,我相应地分配数据。当我处理完数据后,我会相应地释放它-但是仪器不会显示任何已释放的数据

我的理论是,默认情况下HTTP请求是缓存的,但是,我不希望我的iPhone应用程序缓存这些数据

有没有一种方法可以在请求后清除此缓存,或者首先阻止缓存任何数据

我尝试过使用所有缓存策略,如下所示:

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

但似乎没有什么能释放记忆

如果使用NSURLConnection,请查看代理:

- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse
返回值


要存储在缓存中的实际缓存响应。委托可以返回cachedResponse unmodified、返回修改后的缓存响应,或者如果不应该为连接存储缓存响应,则返回nil。

通常这样创建请求比较容易

NSURLRequest *request = [NSURLRequest requestWithURL:url
      cachePolicy:NSURLRequestReloadIgnoringCacheData
      timeoutInterval:60.0];
然后创建连接

NSURLConnection *conn = [NSURLConnection connectionWithRequest:request
       delegate:self];
并在委托上实现connection: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];
    }
}

我希望它适用于某些人:)

如果不是特定于单个请求(您希望禁用整个应用的缓存),那么下面的一个是最好的选择。在应用程序委托中添加此代码或根据您的需要在任何位置添加此代码

        int cacheSizeMemory = 0; // 0MB
        int cacheSizeDisk = 0; // 0MB
        NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:cacheSizeMemory diskCapacity:cacheSizeDisk diskPath:@"nsurlcache"];
        [NSURLCache setSharedURLCache:sharedCache];

如果您使用的是
NSURLSession
,另一种防止请求和参数写入应用程序
缓存
目录中的
缓存.db
iOS的解决方案是将会话配置的
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)
大概是磁盘大小的0停止了iOS对磁盘的写入,但是如果您有策略
重新加载IgnoringLocalCacheData
,那么您可能对内存缓存也不感兴趣

注意这将阻止创建任何
缓存/Cache.db
(请求和响应)或
缓存/fsCachedData/
文件夹(响应数据)。出于安全考虑,我们决定在应用程序中采用这种方法,因为我们不希望我们的请求永远存储在磁盘缓存中

如果有人知道是否有一种方法可以停止仅请求缓存,而保留iOS URL加载机制中的响应数据缓存,我很想知道。(据我所知,没有API或官方文档)

假设服务器实现正确,将
Cache Control:no store
头放入请求将生成具有相同头的服务器响应,从而导致
NSURLCache
不将响应数据存储在磁盘上

因此,无需使用鸟枪式方法禁用
NSURLCache
磁盘缓存


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

,它可能与缓存无关吗?您是否尝试过检查数据,以查看应该重新加载的数据是否实际上是旧数据?也许你的韭菜是从别处来的。如何初始化和释放NSURL请求?这可能有助于诊断问题。仅供参考–如果您想通过暴力删除文件,这里有示例代码:非常感谢。我的应用程序的内存占用突然减少了一半!尼克,非常感谢你的帮助!尼克。谢谢你的建议——我曾多次这样给一个SOAP web服务打电话,尽管泄密没有显示出任何问题,但它的数量仍在不可控地增长。我优化了几天,最后尝试阻止缓存,因为来自内部框架的很多CFURL*对象都挂在周围。从willCacheResponse返回nil是唯一有效的方法!为什么需要同时执行
nsurlRequestReloadIgningCacheData
和实现
连接:willCacheResponse:
?嗨,我可以用它来加载本地内容吗?上面是针对NSUrlConnection的,但我正在使用NSUrlRequest将本地HTML数据加载到UIWebView中。我需要拒绝任何缓存,因为有图像从SQLite进入webview,并且内存随着页面负载的增加而增加。谢谢。@fabb,重写
连接:willCacheResponse:
允许您不将响应存储在缓存中
NSURLRequestReloadIgnoringCacheData
指定连接应在不检查缓存的情况下加载请求。前者可能有助于管理内存分配。这是解决我的问题的完美方案,我有重新登录问题,因为凭据已存储并由NSURLConnection自动提交,非常感谢这对我有很大帮助:)谢谢这对我来说很有用,我真的很感谢你的建议。实际上,我的问题是NSURL请求存储用户名和密码。因此,这有助于从缓存中删除用户凭据…对我来说非常有用,但您可以使用0,而不是执行最终为0的乘法。您是否找到了这个问题的答案?
NSMutableURLRequest* request = [[NSMutableURLRequest alloc] url];
[request setValue:@"no-store" forHTTPHeaderField:@"Cache-Control"];
[request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];