我正在尝试使用内置于iOS 5的基于磁盘的网址。我有一个json feed,我想加载然后缓存,所以它会在用户下次使用该应用时立即加载。 cache.db文件已成功创建,如果我在sqlite-editor中打开它,我可以获取数据。
我正在使用AFNetworking
NSURL *url = [NSURL URLWithString:@"http://myurl.com/json"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
NSLog(@"%d before call",[[NSURLCache sharedURLCache] currentDiskUsage]); // logs 0 bytes
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
// is successfully loading JSON and reading it to a table view in a view
}failure:nil];
NSCachedURLResponse *cachedResponse = [[NSURLCache sharedURLCache] cachedResponseForRequest:request]
// this returns nil, and can't load the request from disk.
在缓存响应块中,奇怪的是缓存现在正在工作,并成功从内存中获取缓存请求。
[operation setCacheResponseBlock:^NSCachedURLResponse *(NSURLConnection *connection, NSCachedURLResponse *cachedResponse) {
NSCachedURLResponse *cachedResponse_ = [[NSURLCache sharedURLCache] cachedResponseForRequest:request];
NSLog(@"%d AFTER CACHE",[[NSURLCache sharedURLCache] currentDiskUsage]);
// this writes out 61440
return cachedResponse;
}];
下次启动应用时,如何从磁盘加载缓存的URL请求?
答案 0 :(得分:1)
当您尝试在第一个代码部分(第9行)中获取缓存的响应时,请求尚未完成。
-[AFJSONRequestOperation JSONRequestOperationWithRequest:success:failure:]
是异步的,因此在请求完成之前,任何内容都不会存储在缓存中。如果您尝试在成功块内(或在缓存响应块中,如在第二个代码部分中所做的那样)获取缓存的响应,它应该可以正常工作。
关于第二个问题,即使您的Cache-Control标头声明您的内容不会在未来到期,也无法保证数据将被NSURLCache缓存。缓存文件始终存储在应用程序的Caches目录中,can be cleared by iOS at any time如果它认为需要释放磁盘空间。
如果您需要确保您的JSON数据始终可用,请将其自己保存在应用的Library/Application Support
目录中,理想情况下with the NSURLIsExcludedFromBackupKey
specified(除非您的应用在没有数据的情况下无法正常运行)。