当前位置:  开发笔记 > IOS > 正文

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

如何解决《是否可以阻止NSURLRequest缓存数据或在请求后删除缓存数据?》经验,为你挑选了5个好方法。

在iPhone上,我使用NSURLRequest对一大块数据执行HTTP请求.对象分配峰值,我相应地分配数据.当我完成数据后,我会相应地释放它 - 但是仪器没有显示任何已释放的数据!

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

有没有办法在请求后清除此缓存或阻止任何数据首先被缓存?

我尝试过使用下面记录的所有缓存策略:

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

但似乎没有什么可以释放记忆!



1> tcurdt..:

通常,更容易创建这样的请求

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

然后创建连接

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

并在委托上实现连接:willCacheResponse:方法.刚刚返回nil应该这样做.

- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse {
  return nil;
}


为什么有必要同时执行`NSURLRequestReloadIgnoringCacheData`*和*实现`connection:willCacheResponse:`?
@fabb,覆盖`connection:willCacheResponse:`允许您不将响应存储在缓存中.`NSURLRequestReloadIgnoringCacheData`指定连接应该加载请求而不检查缓存.前者可能是有助于管理内存分配的.

2> 小智..:

当我从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];
    }
}

我希望它适用于某人:)



3> catlan..:

如果您使用NSURLConnection,请查看委托:

- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse

回报价值

存储在缓存中的实际缓存响应.委托可以不修改返回cachedResponse,返回修改后的缓存响应,如果没有为连接存储缓存响应,则返回nil.



4> 小智..:

如果你正在使用NSURLSession,另一个防止Cache.db在app的Caches目录中创建写入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写入磁盘,但如果你有策略,reloadIgnoringLocalCacheData那么你可能对内存缓存也不感兴趣.

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

如果有人知道有一种方法可以停止请求缓存,但保持从iOS URL加载机制缓存响应数据,我有兴趣知道.(根据我的判断,没有关于此的API或官方文档)



5> Sanjeev Rao..:

如果不是特定于单个请求(U想要为整个应用程序禁用缓存),则最好选择.在app delegate中添加此代码或根据您的需要在任何地方

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


对我来说很有用,但是你可以使用0而不是进行最终为0的乘法.
不幸的是,对我不起作用
推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有