标签: nsurlcache

如何使用NSURLCache在离线时返回缓存的API响应(iOS App)

我希望有人可以对我正在研究的一些事情有所了解,但没有取得多大进展.

我想利用NSURLCache返回我在iOS App中进行的API调用的缓存响应.当设备在线时,我想返回缓存的响应,如果它已经足够,否则从远程获取.当设备离线时,我想立即返回缓存的响应(如果有的话),无论它的年龄如何.

我正在使用AFNetworking.我正在调用的API调用是我控制的服务器.协议是HTTPS.的Cache-Control响应报头是目前"max-age=0, public".我目前没有设置缓存相关的请求标头(我应该吗?).我将请求的缓存策略设置为NSURLRequestReturnCacheDataDontLoad脱机NSURLRequestUseProtocolCachePolicy时在线时使用默认值.我可以在默认Cache.db的磁盘上看到请求及其响应.但是,当我离线时,所有请求都会失败(没有缓存的响应(尽管看起来已被缓存)正在使用/返回.

根据http://nshipster.com/nsurlcache/我初始化一个sharedURLCachein didFinishLaunchingWithOptions并将AFNetworking setCacheResponse块设置为这样的:

NSMutableDictionary *mutableUserInfo = [[cachedResponse userInfo] mutableCopy]; 
NSMutableData *mutableData = [[cachedResponse data] mutableCopy]; 
NSURLCacheStoragePolicy storagePolicy = NSURLCacheStorageAllowed;
return [[NSCachedURLResponse alloc] initWithResponse:[cachedResponse response] data:mutableData userInfo:mutableUserInfo storagePolicy:storagePolicy];

我已经阅读了有关该主题的这些和其他帖子:

http://petersteinberger.com/blog/2012/nsurlcache-uses-a-disk-cache-as-of-ios5/ http://blackpixel.com/blog/2012/05/caching-and-nsurlconnection.html

我想知道是否有人在使用该标准之前是否成功实现了这一功能NSURLCache(也对成功案例感兴趣,SDURLCache但Peter S.说,​​因为支持iOS5磁盘缓存因此SDURLCache不再需要,即我想使用默认内置缓存).

提前致谢!

objective-c nsurlcache ios afnetworking

13
推荐指数
1
解决办法
5578
查看次数

iPhone:NSURLRequestCachePolicy设置之间的性能差异

在iPhone上使用NSURLRequest时,各种NSURLRequestCachePolicy设置之间的真实性能差异是什么?我特别感兴趣的是缓存策略对用户对UIWebView页面显示速度的感知的影响.

我一直在使用默认值,NSURLRequestCachePolicy但我认为NSURLRequestReloadRevalidatingCacheData可能最适合大多数情况,特别是在返回上一页时.

如果您在现实条件下使用了各种缓存策略,哪种策略在特定情况下被证明是最佳的?什么政策提供了三种不同类型的iPhone连接,Wi-Fi,3G和Edge的最佳整体性能?缓存策略是否会对用户对页面加载速度的感知产生任何重大影响,还是应该在其他地方寻找优化UIWebView的显示时间?

更新:

似乎有一种共识,即UIWebView似乎忽略了任何NSURLRequest上的缓存设置.我不完全相信这是最后的答案,但是除非有时间进行一些广泛的测试,否则我无法忍受.因此,我接受评价最高的答案.但是,如果问题对您的项目很重要,我会建议您尽量回答. - TechZen.

iphone uiwebview nsurlcache ipad

11
推荐指数
1
解决办法
3342
查看次数

在iOS上,如果diskPath:nil,则存储NSURLCache缓存?

我遇到过这样的代码:

NSURLCache *URLCache = 
    [[NSURLCache alloc] initWithMemoryCapacity:1024 * 1024 
                                  diskCapacity:1024 * 1024 * 5 
                                      diskPath:nil];
Run Code Online (Sandbox Code Playgroud)

问题是,当diskPath传递nil时,我无法找到预期的行为. NSURLCache文档没有明确描述这种情况,也没有用我自己的测试来解决这个问题.

缓存存储在哪里?或者是错误之上的代码?

谢谢.

nsurlcache ios

11
推荐指数
1
解决办法
5148
查看次数

NSURLCache在iOS5上提供不一致的结果,看似随意

我刚刚花了很长时间在NSURLCache上大喊大叫,所以我提供了一些建议,希望别人可以避免我的不幸.

这一切都开始得相当合理.我的新应用程序项目仅针对iOS 5及更高版本,因此我认为我可以利用新的NSURLCache实现来满足我的所有Web缓存需求.我需要NSURLCache的自定义子类来处理一些特殊任务,但API似乎都有所帮助.快速阅读文档,我即将参加比赛:

[NSURLCache setSharedURLCache:[[MyCustomCache alloc] initWithMemoryCapacity:8 * 1024 * 1024 //8mb 
                                                                    diskCapacity:32 * 1024 * 1024 // 32mb 
                                                                        diskPath:@"webcache.db"]];
Run Code Online (Sandbox Code Playgroud)

我认为8mb缓存可以启动,我会用更大的磁盘缓存来支持它,这样我们就可以在本地提供更多更大的图像.我将我的网络代码的其余部分连接起来使用NSURLConnection(实际上,我使用的是MKNetworkKit,但事实证明这是无关紧要的),并期待我的缓存中有很多东西.果然,所有应该缓存的请求都会尽职尽责地保存到缓存中,并且当缓存中提供响应时,响应会尽快快速地返回.这是Penrance of Penzance的常规制作,在我的网络堆栈中飞来飞去.

除非有些东西没有加起来.可以从缓存提供的请求仍然通过网络传出.除非他们不是.高速缓存是否实际用于提供请求似乎完全随机且间歇性.我沮丧地撕掉了我的头发,并在字面上挖掘所有试图找出正在发生的事情.我构建测试应用程序,在整个地方设置断点,撕掉数据包跟踪,读取互联网上提到NSURLCache的每个单词,试验缓存控制标题,注释掉代码,绕过我的子类,甚至通过艰苦追踪为NSURLCache及其CFNetworking朋友组装,试图了解下面的神秘逻辑.我大量提高了我对ARM和Objective-C调用约定的知识,并对低级调试有了一些了解,但实际上无法弄清楚发生了什么.整个事情感觉更像是Iolanthe的梦魇之歌,而不是海盗王的良性独裁,而我几乎已经把它扔掉了.

TL/DR版本:NSURLCache似乎正在工作,但即使它们可用,也会随机返回缓存的结果.

caching nsurlconnection nsurlcache ios5

11
推荐指数
1
解决办法
2455
查看次数

iOS上的NSURLConnection不会尝试缓存大于50KB的对象

尽管Apple的文档另有说明,但NSURLCache在iOS上根本不进行任何磁盘(闪存)缓存.您可以子类化NSURLCache以更改获取和存储操作的行为以使用磁盘(如同SDURLCache),但由于以下严格限制了缓存的使用和实现方式,这不会像您期望的那样好用:

  • NSURLConnection甚至没有调用storeCachedResponse:forRequest:大约50KB的文件(确切地说> = 52428字节).这使得子类NSURLCache对我们的使用毫无意义(200KB图像),因为它甚至不会进入缓存.因此,我们必须在上面的级别手动添加缓存NSURLConnection.
  • 即使storeCachedResponse:forRequest:手动调用NSURLCache的内置函数,它也只会将响应存储在内存中,如果它小于大约180KB.我通过手动调用storeCachedResponse测试了这一点,并且发现currentMemoryUsage对于大约180KB以上的数据长度,之前/之后没有改变.所以我们也必须编写自己的LRU内存缓存.

有没有人注意到这些问题?还是有什么我想念的?

仅供参考,我在模拟器和iPad 2上运行iOS 4.3.

caching objective-c nsurlconnection nsurlcache ios

9
推荐指数
1
解决办法
3742
查看次数

当transfer-encoding的响应头值被分块时,NSURLCache不起作用

NSURLCache今天我在Charles Proxy中检查请求和响应头时发现了(可能)的问题.这个问题有点令人困惑,但我能够一贯地重复它:

简而言之,该问题与NSURLRequest使用NSURLCache默认策略的iOS本机缓存s 有关.事实证明,只要响应有标头,就不会缓存请求transfer-encoding: chunked.但是如果响应头是content-length: xxx相反的,缓存工作正常.具体来说,似乎当响应被分块时,NSURLCache不会保存eTag并且忽略将if-none-match标头附加到对同一URL的后续请求,因此,缓存失败(应该如此),即返回200而不是一个304.

我在iOS8.2模拟器上测试.即使你没有解决方案,我也很乐意听到你是否遇到过同样的问题.我找到了至少一个类似的报告),这是我的后端工程师发布相关主题.

caching nsurlcache ios swift ios8

9
推荐指数
1
解决办法
506
查看次数

清除本地文件的webviews缓存

我发现了一些类似的帖子,但它们似乎对我正在做的事情没有任何影响.我有一个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时,仍然留下了内存.当我重新进入并重新分配时,它没有使用相同的内存.

我不认为这是正确的方向.这些都被标记为阻止网页缓存的方法,但它们似乎对本地文件没有影响.我真的不确定这个还有什么去的.如果有人知道如何强制缓存清除,或者首先阻止缓存,我会非常感谢一些帮助.

uiwebview nsurlcache ios

8
推荐指数
1
解决办法
1851
查看次数

NSURLCache使用什么缓存算法?

Apple的NSURLCache类有很好的文档,但它没有说明它使用的缓存算法.它是LRU,LFU还是完全不同的东西?

我正在为iPad开发,我希望NSURLCache通过使用[NSURLCache setDiskCapacity](默认似乎为0)利用磁盘缓存功能来缓存照片.这个值的上限是多少?

caching objective-c nsurlconnection nsurlcache ios

8
推荐指数
1
解决办法
1100
查看次数

NSURLCache没有缓存

所以我有子类NSURLCache,每次我调用loadHTMLFromString:storeCachedRequest:forRequest:然后cachedResponseForRequest:.这就是我所拥有的:

- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request
{
    NSString *pathString = [[request URL] absoluteString];

    NSCachedURLResponse * response = [super cachedResponseForRequest:request];
    if (response != nil)
        return response;
    else {
        NSString* myString= @"testing";

        NSData* data=[myString dataUsingEncoding: NSASCIIStringEncoding ];

        //
        // Create the cacheable response
        //
        NSURLResponse *response =
        [[[NSURLResponse alloc]
          initWithURL:[request URL]
          MIMEType:[self mimeTypeForPath:pathString]
          expectedContentLength:[data length]
          textEncodingName:nil]
         autorelease];
        NSCachedURLResponse * cachedResponse =
        [[[NSCachedURLResponse alloc] initWithResponse:response data:data] autorelease];

        [self storeCachedResponse:cachedResponse forRequest:request] ;

        //NSLog(@"DEFAULT CACHE WITH URL %@", …
Run Code Online (Sandbox Code Playgroud)

iphone objective-c nsurlcache ipad

8
推荐指数
1
解决办法
2909
查看次数

Alamofire - NSURLCache不工作?

我将缓存设置如下

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)

价值是零

有什么想法吗?

nsurlcache swift alamofire

8
推荐指数
2
解决办法
1万
查看次数