如何缓存 NSUrlSession 响应数据

How to cache NSUrlSession response data

我知道这个问题问了很多次了,但是这些都没有解决我的问题。我想缓存从 URl 获取的 Web 服务数据。如果缓存数据可用,则从缓存加载数据,并在后台线程中加载数据,它还会检查数据是否已更改,然后缓存更新并使用新数据加载数据。 我尝试了以下代码但没有任何效果。

-(void)getcountrylist
{
    [self setSharedCacheForImages];

    NSString *urlString = @"https://restcountries.eu/rest/v1/all";

    NSURLSession *session = [self prepareSessionForRequest];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString]];
    [request setHTTPMethod:@"GET"];

    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        if (!error) {
            NSArray *jsonResponse = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
            dispatch_async(dispatch_get_main_queue(), ^{

               NSLog(@"Result new = %@",jsonResponse);

            });
        }
    }];
    [dataTask resume];
}

- (NSURLSession *)prepareSessionForRequest
{
    NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
    [sessionConfiguration setHTTPAdditionalHeaders:@{@"Content-Type": @"application/json", @"Accept": @"application/json"}];

    NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration];

    return session;
}

- (void)setSharedCacheForImages
{
    NSUInteger cashSize = 250 * 1024 * 1024;
    NSUInteger cashDiskSize = 250 * 1024 * 1024;
    NSURLCache *imageCache = [[NSURLCache alloc] initWithMemoryCapacity:cashSize diskCapacity:cashDiskSize diskPath:@"https://restcountries.eu/rest/v1/all"];

    [NSURLCache setSharedURLCache:imageCache];   
}

您可以使用NSMutableURLRequest class setCachePolicy 方法处理缓存数据。有很多方法可以对应看看。

NSURLRequestReloadIgnoringCacheData: 此方法忽略缓存数据并从服务器获取最新的更新响应。

指定 URL 加载的数据应从原始源加载。不应使用现有缓存数据来满足 URL 加载请求。

NSURLRequestUseProtocolCachePolicy: 指定协议实现中定义的缓存逻辑(如果有)用于特定的 URL 加载请求。这是 URL 加载请求的默认策略。

NSURLRequestReloadIgnoringLocalAndRemoteCacheData: 指定不仅应该忽略本地缓存数据,而且应该指示代理和其他中间体到目前为止忽略它们的缓存在协议允许的情况下。

更多的在这里检查: source.

使用:

NSURLRequest *Request = [NSURLRequest requestWithURL:[NSURL URLWithString:URLForService_Providers] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10.0];

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
[request setCachePolicy:NSURLRequestReloadIgnoringCacheData];