Ios 加载带有标题的图像并缓存它-Objective-C(macOS应用程序)
我需要从带有forHTTPHeaderField的缩略图url加载大图像并缓存它,这样就不会一次又一次地从url加载。下面是我正在使用的代码Ios 加载带有标题的图像并缓存它-Objective-C(macOS应用程序),ios,objective-c,macos,Ios,Objective C,Macos,我需要从带有forHTTPHeaderField的缩略图url加载大图像并缓存它,这样就不会一次又一次地从url加载。下面是我正在使用的代码 NSString *urlStr = [NSString stringWithFormat:@"%@",medialurl]; NSURL *url = [NSURL URLWithString:urlStr]; NSMutableURLRequest *request = [[NSMutableURLRequest alloc]
NSString *urlStr = [NSString stringWithFormat:@"%@",medialurl];
NSURL *url = [NSURL URLWithString:urlStr];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setHTTPMethod:@"GET"];
[request setURL:url];
[request addValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request addValue:@"abcd" forHTTPHeaderField:@"ABC"];
[request addValue:@"xyzzy" forHTTPHeaderField:@"XYZ"];
[RestService fetchDataWithCompletionBlock:request completionHandler:^(NSData * _Nonnull responseData, NSURLResponse * _Nonnull response, NSError * _Nonnull error) {
NSString *responseStr = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
NSLog(@"responseStr: %@", responseStr);
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;
long code = (long)[httpResponse statusCode];
NSLog(@"response status code: %ld", code);
completionBlock(responseData);
}];
对您的请求设置不同的缓存策略是否有帮助
request.cachePolicy = NSURLRequestReturnCacheDataElseLoad;
仅当不存在缓存数据时,才使用现有缓存数据,而不管其年龄或过期日期如何,从原始源加载
cachePolicy属性上有一个说明,说明:
对于用于构造NSURLSessionUploadTask和NSURLSessionDownloadTask对象的请求,将忽略此属性,因为URL加载系统不支持上载或下载请求的缓存
因此,如果这就是您执行请求的方式,那么这可能不起作用,您可能需要自己管理此请求的缓存
假设您正在使用共享缓存,而不是创建自己的缓存,您可以通过以下方式检查请求是否有缓存响应:
NSCachedURLResponse* cachedResponse = [[NSURLCache sharedURLCache] cachedResponseForRequest:request];
if ( cachedResponse )
{
NSHTTPURLResponse* response = (NSHTTPURLResponse*)cachedResponse.response;
NSLog(@"Cached Response: %@", response.allHeaderFields);
}
else
{
NSLog(@"No Cached Response");
}
如果端点使用ETag,还可以存储缓存响应中ETag头字段的值,然后将其与发出请求时返回的值进行比较,这将告诉您返回的响应是否确实来自缓存
如果上面告诉您,您的请求没有缓存响应,那么您必须研究为什么它可能没有缓存以前的响应。从服务器返回的缓存控制头可能存在问题,不允许您缓存响应?如果是这种情况,而您无法控制服务器端,则必须使用另一种方法来缓存图像。有很多第三方库可以这样做。如何使用它们,或者阅读它们所做的事情并激发您的灵感?我已经浏览了第三方lib,但有些lib加载映像带有缓存,而没有forHTTPHeaderField,其他lib加载映像带有forHTTPHeaderField,但没有缓存。你能给我推荐一些库,里面有加载图像的代码,用forHTTPHeaderField缓存它,下次再从缓存中加载它。谢谢,谢谢@BenW。它只适用于少数图像。很少有图像加载速度很快,但有些图像仍然需要很长时间才能加载,我想这仍然是从url而不是缓存中获取的。@SatishA我编辑了我的答案,为您提供了一些选项,以了解为什么可能不使用缓存。