我发现了一些类似的帖子,但它们似乎对我正在做的事情没有任何影响.我有一个UIWebView我用来在我的包中显示本地内容的东西.具体来说,我正在显示一个docx文件.用户应该很少看到这个文档,我的应用程序内存紧张,所以我想做的是阻止UIWebView缓存文档.另一个可行的选择是在用户离开视图时清除缓存.每次用户进入视图时,我都必须从头开始加载它.
我这样加载文档:
NSString * path = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"Intro text"] ofType:@"docx"];
NSURL * url = [NSURL fileURLWithPath:path];
request = [NSURLRequest requestWithURL:url];
doc_view_rect = CGRectMake(5,105,self.view.frame.size.width,self.view.frame.size.height);
doc_viewer = [[UIWebView alloc] initWithFrame:doc_view_rect];
[doc_viewer loadRequest:request];
Run Code Online (Sandbox Code Playgroud)
在我尝试停止缓存时,我尝试过:
[[NSURLCache sharedURLCache] setMemoryCapacity:0];
[[NSURLCache sharedURLCache] setDiskCapacity:0];
Run Code Online (Sandbox Code Playgroud)
和:
NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];
[sharedCache release];
sharedCache = nil;
Run Code Online (Sandbox Code Playgroud)
和:
if(request) {
[[NSURLCache sharedURLCache] removeCachedResponseForRequest:request];
}
[[NSURLCache sharedURLCache] removeAllCachedResponses];
Run Code Online (Sandbox Code Playgroud)
我也尝试设置网络视图缓存策略,但这似乎只是吃了内存,就像我发布webview时,仍然留下了内存.当我重新进入并重新分配时,它没有使用相同的内存.
我不认为这是正确的方向.这些都被标记为阻止网页缓存的方法,但它们似乎对本地文件没有影响.我真的不确定这个还有什么去的.如果有人知道如何强制缓存清除,或者首先阻止缓存,我会非常感谢一些帮助.
我将缓存设置如下
var cacheSizeMemory = 20 * 1024 * 1024
var cacheSizeDisk = 100 * 1024 * 1024
var sharedCache = NSURLCache(memoryCapacity: cacheSizeMemory, diskCapacity: cacheSizeDisk, diskPath: "SOME_PATH")
NSURLCache.setSharedURLCache(sharedCache)
Run Code Online (Sandbox Code Playgroud)
使用缓存策略创建请求
var request = NSMutableURLRequest(URL: NSURL(string: "\(baseUrl!)\(path)")!, cachePolicy: .ReturnCacheDataElseLoad, timeoutInterval: timeout)
Run Code Online (Sandbox Code Playgroud)
提出请求并获得以下回复 Cache-Control private, max-age=60
然后尝试检查缓存
var cachedResponse = NSURLCache.sharedURLCache().cachedResponseForRequest(urlRequest)
Run Code Online (Sandbox Code Playgroud)
价值是零
有什么想法吗?
首先,问题是失败的问题..如果你只是想看看它们是什么,请跳到这篇文章的底部,你会看到它们以粗体显示..更多细节,那么你可以阅读这篇文章的其余部分......
我只是试图解决我的NSURLConnection,以便它的工作顺利,我理解这一点.互联网上的异步连接缺乏示例/教程,或者没有任何我能找到的解释说明除了获得连接和运行之外的任何深度,除了工作之后,它似乎非常简单.希望这个问题可以填补我觉得其他用户的空白.
因此,在我的.h文件中,我导入了基础头并声明了接收或缺少接收数据所需的方法(错误等).
.H
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h> //add foundations
//.. other headers can be imported here
@interface MyViewController: UITableViewController {
//Im not setting any delegates to access the methods because Is all happening in the same
//place so I just use the key word 'self' when accessing the methods declared below
//I'm not sure if this is the best thing to do but I wasn't able to get my head around declaring the delegate or how it would help …Run Code Online (Sandbox Code Playgroud) 我正在实现一个应用程序,它可以对我们也控制的rest-api进行大量的网络调用.最近我们决定在服务器端引入缓存头,以节省一些宝贵的网络和服务器时间.由于我们事先不知道数据有效的时间长短,我们不是发送Cache-control: max-age或Expires标题,我们所做的只是发送一个Last-Modified标题和a E-tag,所以我们总是点击服务器,但响应速度非常快,大部分时间都是304.一开始似乎一切正常,许多请求都被缓存了.但是,由于缓存,我在应用程序上遇到一些随机数据错误.
出于某种原因,我无法理解,在某些时候,请求被本地缓存并且在没有命中服务器的情况下被用作"更新"数据,而实际上并非如此.问题一直存在,直到一段时间过去.然后一切都正常地再次进入服务器,就像它使用cache-control标题一样,但没有它!所以,我的问题是:
如何能NSURLCache一起NSURLConnection决定某个特定请求不需要去上网时,原来的请求没有附带Cache-control: max-age或Expires头?有谁经历过类似的影响?如何在不删除整个缓存的情况下解决它?
更多背景信息:
NSURLConnection所以我认为它不会改变任何东西[NSURLCache sharedURLCache]实例这是一个GET请求,当我从缓存的响应中检查标头时,这就是我得到的:
po [response allHeaderFields]
"Access-Control-Allow-Headers" = "Content-Type";
"Access-Control-Allow-Methods" = "GET, POST, DELETE, PUT";
"Access-Control-Allow-Origin" = "*";
Connection = "keep-alive";
"Content-Encoding" = gzip;
"Content-Length" = 522;
"Content-Type" = "application/json";
Date = "Mon, 02 Sep 2013 08:00:38 GMT";
Etag …Run Code Online (Sandbox Code Playgroud)我正在尝试保护存储在NSURLCache中的敏感数据.我的应用程序文件和Core Data sqlite文件设置为NSFileProtectionComplete.但是,我无法将NSURLCache文件数据保护级别更改为NSFileProtectionCompleteUntilFirstUserAuthentication以外的任何其他级别.这会在设备锁定时暴露缓存中的任何敏感数据.
我需要缓存响应,因此重复请求返回304响应,以防止数据在没有必要时多次重新处理.此外,我还需要在设备锁定时保护缓存.
有没有人有任何保护NSURLCache数据的建议?
我已经问过什么时候从urlcache的内存和磁盘中删除了什么?
现在我还有一些后续问题:
内存缓存受iPhone的内存(通常为2Gb)限制.但磁盘持久性受到64Gb或128Gb的限制.那是对的吗?
持久性比内存存储更有意义吗?如果您不想拥有较高的内存占用(并且不希望应用程序从其挂起状态终止),即允许从磁盘存储中恢复缓存然后返回持久结果,它是否有用?
控制点击后,URLCache.shared我看到以下评论:
- 内存容量:4兆字节(4*1024*1024字节)
- 磁盘容量:20兆字节(20*1024*1024字节)
- 磁盘路径:
(user home directory)/Library/Caches/(application bundle id)没有特殊缓存要求或约束的用户应该可以找到可接受的默认共享缓存实例.如果此默认共享缓存实例不可接受,
+setSharedURLCache:则可以调用NSURLCache此实例以设置从此方法返回的其他实例.调用者应该注意确保在没有其他调用者具有对先前设置的共享URL缓存的引用时调用setter.这是为了防止存储缓存数据变得意外无法恢复.
所以我认为我的理由是正确的.
读取/写入/恢复缓存的整个过程如何工作?
我的意思是当我第一次发出网络请求时,整个响应/错误/数据是否被写入 /存储在缓存中然后进入持久性?
下次如果我想读取它然后它首先从缓存开始然后如果响应不是陈旧/过期然后它将返回它.磁盘存储没有任何改变.
如果它已过期,那么它将发出新请求,并且只有在获得成功响应后,它才会清除内存和磁盘的响应,并将新响应写入缓存和磁盘.如果新请求失败,那么它将不会被清除,而是只保留过期/过期数据,所以如果我们想要(加载过期响应)它将从那里加载?
当应用程序终止时,内存将被刷新.除非设备内存不足或已达到大小限制,否则磁盘存储将保持不变.在下次启动应用程序时,内存会将磁盘存储中的任何内容重新加载到缓存中.
此缓存恢复将开始加载已存储的最新数据,然后移动到较旧的数据,直到它达到其大小限制或仅到达存储在磁盘上的项目的末尾.对?
我问这一切是因为我想改善应用程序中的缓存体验并提高我的整体理解,所以我不会过多地增加应用程序的内存使用量*因此它不会从内存中刷新内存暂停状态由于我的应用程序高内存使用或其他需要的应用程序.
*:我们的一些网络请求将下载缩略图,因此当我增加缓存大小限制时,我需要考虑周到.
Apple 从 iOS 5.0 开始支持磁盘缓存。我以前使用过家庭滚动解决方案,但我正在测试,NSURLCache希望最终使用它,因为我过去见过奇怪的行为。
我遇到的更令人困惑的问题之一是cachedResponseForRequest:返回过期的请求。我一直在通过将我正在使用的 iPhone 上的时钟调快来进行测试。解析标头清楚地表明设备时间早于到期日期。
我愿意接受可能有一个后台任务会定期修剪过期的请求。我已经完成了测试,我实际上等待查看请求是否“自然”过期,但事实并非如此。
苹果只是未能正确实现缓存失效吗?
我正在使用Charles代理进行测试。这是一个棘手的问题,我并不羡慕任何必须实现缓存失效的人,但 iOS 现在应该是一个成熟的 SDK。
我知道NSCache是线程安全的,但我找不到任何提到NSURLCache的线程安全的文件.
let memoryCapacity = 200 * 1024 * 1024
let diskCapacity = 1 * 1024 * 1024
let cache = URLCache(memoryCapacity: memoryCapacity, diskCapacity: diskCapacity, diskPath: "myDataPath")
URLCache.shared = cache
Run Code Online (Sandbox Code Playgroud)
场景1
我将 urlcache 的内存设置为 200mb,并将磁盘空间设置为 1mb。然后我下载一张图片。关闭互联网并强制退出应用程序,通过点击再次启动应用程序,并触发调用(下载图像),但它立即崩溃,data因为nil
不用说,如果我关闭互联网,它仍然会按预期从缓存中读取,并且不会发生崩溃。
场景2
如果我将 diskCapacity 设置为 200mb ( let diskCapacity = 200 * 1024 * 1024),那么即使缓存被刷新出内存,图像仍然保留在磁盘中;它会永远显示!
根据这一观察,我有以下问题:
在 AppDelegate.m 中,我配置了:
NSURLCache *sharedURLCache = [[NSURLCache alloc] initWithMemoryCapacity:20 * 1024 * 1024 diskCapacity:100 * 1024 * 1024 diskPath:@"FhtHttpCacheDir"];
Run Code Online (Sandbox Code Playgroud)
然后是http请求:
- (void) testRestfulAPI{
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:config];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://192.168.0.223:8000/v1/topictypes"]];
[request setHTTPMethod:@"GET"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
NSError *error = nil;
if (!error) {
NSURLSessionDataTask *downloadTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (!error) {
NSHTTPURLResponse *httpResp = (NSHTTPURLResponse*) response;
if (httpResp.statusCode == 200) {
NSDictionary* json = …Run Code Online (Sandbox Code Playgroud) nsurlcache ×10
ios ×9
caching ×4
memory ×2
afnetworking ×1
alamofire ×1
disk ×1
http-caching ×1
iphone ×1
nsurlrequest ×1
nsurlsession ×1
swift ×1
uiwebview ×1
urlsession ×1