Ios 加载带有标题的图像并缓存它-Objective-C(macOS应用程序)

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]

我需要从带有forHTTPHeaderField的缩略图url加载大图像并缓存它,这样就不会一次又一次地从url加载。下面是我正在使用的代码

    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我编辑了我的答案,为您提供了一些选项,以了解为什么可能不使用缓存。