如何缓存NSUrlSession响应数据

时间:2017-01-27 09:37:59

标签: ios objective-c nsurlsession nsurlcache

我知道这个问题需要很多时间,但所有这些都没有解决我的问题。我想缓存从URl进入的Webservice Data。如果缓存数据可用,则从缓存加载数据,并在后台线程中加载数据,它还检查数据是否已更改,然后缓存更新和数据加载新数据。 我尝试了以下代码但没有任何效果。

-(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];   
}

1 个答案:

答案 0 :(得分:1)

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

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

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

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

<强> NSURLRequestReloadIgnoringLocalAndRemoteCacheData:指定不仅应该在本地高速缓存的数据被忽略,但代理和其他中间体应指示忽视它们的高速缓存,只要该协议允许

请点击此处查看: source

用途:

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

OR

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