离线状态下,带有dataTask的NSURLCaching无法通过NSURLRequest读回缓存

时间:2018-12-06 19:55:27

标签: ios caching nsurlsession nsurlcache nsurlsessiondatatask

我对iOS缓存系统感到非常困惑。它应该简单明了,但不是(对我而言)。我正在编写一个数据库应用程序,它允许外部网络以网页形式访问有限范围的其他参考资料。有时,在没有WiFi或Cell数据的字段中,用户可能需要访问外部网页。我认为很简单,在Internet可用的时候,在遍历一组外部页面时使用URLCaching。然后,使用NSURLRequestReturnCacheDataElseLoad的请求策略。 因此,我在AppDelegate中创建了一个共享缓存,然后在一个单例会话中创建了一个

    NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
    sessionConfig.URLCache = self->_myCache;
    sessionConfig.requestCachePolicy = NSURLRequestReturnCacheDataElseLoad;
    sessionConfig.HTTPMaximumConnectionsPerHost = 5;
    session = [NSURLSession sessionWithConfiguration:sessionConfig
                                            delegate:self
                                       delegateQueue:nil];

然后使用dataTask填充高速缓存(因为downloadTask试用版没有填充高速缓存):

    NSURLSessionDataTask *myTask = [[NSURLSessionDataTask alloc] init];
do {
      myTask = [self.session dataTaskWithRequest:req];
      myTask.taskDescription = searchName; //Iterating several values of searchName
      [myTask resume]; } while ...searchNames...

这将填充高速缓存,如cache.currentDiskUsage和cache.currentMemoryUsage所示。初始提取后,再运行Web读取循环不会进一步增加缓存的大小。

这是问题所在: 在互联网关闭的情况下运行此代码片段无法从缓存中读取

NSURL *nsurl=[NSURL URLWithString:@"https:searchName"];
NSURLRequest *nsrequest = [NSURLRequest requestWithURL:nsurl cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:60.0];
[_webView loadRequest:nsrequest];

此外,一旦缓存被填满,尝试在互联网关闭的情况下重复进行第一轮获取操作,则会导致

TIC TCP Conn Failed [1:0x6000028ce580]: 1:50 Err(50)

如果在HTTP中填充了dataTask和使用NSURLRequest从高速缓存中进行读取,是否在高速缓存之间没有互操作性?我究竟做错了什么?有没有其他方法可以解决我的设计目标?

1 个答案:

答案 0 :(得分:0)

经过三天的试验,我能够创建一个大约三百个网页(带有相关的嵌入式图像)的缓存,并在应用程序启动时从持久性内存中读取它们。 访问缓存的唯一方法是使用NSURLCache cachedResponseForRequest:方法。通过适当的CachePolicy使用其他形式的访问URL似乎无效。

cachedResponseForRequest:方法似乎有一个不幸的副作用,因为它只将原始的html文档传递给wkwebview,而没有任何链接的资源被验证也位于我的缓存中。

有人建议获得这个限制吗?