我对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从高速缓存中进行读取,是否在高速缓存之间没有互操作性?我究竟做错了什么?有没有其他方法可以解决我的设计目标?
答案 0 :(得分:0)
经过三天的试验,我能够创建一个大约三百个网页(带有相关的嵌入式图像)的缓存,并在应用程序启动时从持久性内存中读取它们。 访问缓存的唯一方法是使用NSURLCache cachedResponseForRequest:方法。通过适当的CachePolicy使用其他形式的访问URL似乎无效。
cachedResponseForRequest:方法似乎有一个不幸的副作用,因为它只将原始的html文档传递给wkwebview,而没有任何链接的资源被验证也位于我的缓存中。
有人建议获得这个限制吗?