iOS网络缓存策略
网络缓存模块是移动网络应用的核心模块,对于一些固定的数据或实时性要求并不太强的数据,开发者往往会在应用中使用缓存策略对数据进行持久化保存,直到缓存的数据过期,在缓存过期之前,相同的网络请求都将被拦截。这种做法有许多优势,列举如下。
(1)节省用户网络传输流量。
(2)本地数据可以更快地加载,优化用户体验。
(3)在断网的情况下,用户依然可以浏览曾经浏览过的数据
为网络请求设置缓存策略
使用Xcode创建一个名为RequestCacheTest的工程,首先在工程的Info.plist文件中添加支持工程进行HTTP请求的相关键值。在ViewController类的viewDidLoad
方法中添加如下测试代码。
NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:10];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSLog(@"%@",data);
}];
[task resume];
上面的代码使用NSURLSession的类方法从www.baidu.com地址进行数据请求,这里的dataTaskWithRequest
方法通过异步的方式进行网络请求,请求返回的数据在block中通过参数传递给开发者。在创建NSURLRequest请求对象时,上面使用了requestWithURL:cachePolocy:timeoutInterval
方法,这个方法的第1个参数设置请求地址URL;第2个参数是请求的缓存策略;第3个参数设置请求的超时时间,测试代码中设置了10s,如果10s后无响应数据,请求就会按超时失败处理。缓存策略可以设置的参数为NSURLRequestCachePolicy类型的枚举,这个枚举中除了一些定义的缓存策略外,常用策略如下(以Objective-C版本为例):
typedef NS_ENUM(NSUInteger, NSURLRequestCachePolicy)
{
//使用HTTP/HTTPS中定义的缓存策略
NSURLRequestUseProtocolCachePolicy = 0,
//无论有无本地缓存数据,都从服务器进行请求
NSURLRequestReloadIgnoringLocalCacheData = 1,
//先检查缓存数据,如果无缓存再进行请求
NSURLRequestReturnCacheDataElseLoad = 2,
//类似于离线模式,无论有无缓存都不进行请求
NSURLRequestReturnCacheDataDontLoad = 3,
};
在上面的缓存策略中,最常用的是NSURLRequestReturnCacheDataElseLoad,这种策略也是基于大多数移动应用的缓存思路。NSURLRequestUseProtocolCachePolicy缓存策略是由服务端定义的,是HTTP/HTTPS协议自带的缓存策略。
运行一次上面的工程,之后将网络断开,再次运行工程,可以看到打印区域依然打印出了请求数据,实际上第2次的请求已经不通过网络获取了,而是直接从本地获取。
摘自《iOS开发实战:从入门到上架App Store(第2版)》