缓存策略
在创建URLRequest时,我们可以指定缓存策略,系统提供了如下几种:
let request = URLRequest(url: url)
let request1 = URLRequest(url: url, cachePolicy: .reloadRevalidatingCacheData, timeoutInterval: 5)
//缓存策略默认为useProtocolCachePolicy
//超时default 60.0s
/**
cachePolicy
1.useProtocolCachePolicy
默认的cache policy,使用Protocol协议定义。
2.reloadIgnoringLocalCacheData
忽略缓存直接从原始地址下载。
3.returnCacheDataDontLoad
只使用cache数据,如果不存在cache,请求失败;用于没有建立网络连接离线模式
4.returnCacheDataElseLoad
只有在cache中不存在data时才从原始地址下载。
5.reloadIgnoringLocalAndRemoteCacheData ! Unimplemented
忽略本地和远程的缓存数据,直接从原始地址下载,与NSURLRequestReloadIgnoringCacheData类似。
6.reloadRevalidatingCacheData !Unimplemented
:验证本地数据与远程数据是否相同,如果不同则下载远程数据,否则使用本地数据
**/
URLCache
ios 提供了一个缓存对象-URLCache,专门负责管理缓存,他是一个全局对象,我们可以在发起请求前对这个全局对象进行设置,进行替换
let cache = URLCache(memoryCapacity: 1024 * 1024 * 100, diskCapacity: 1024 * 1024 * 100,
diskPath: nil)
URLCache.shared = cache//全局替换
//局部替换
//let sessionConfig = URLSessionConfiguration.default
//sessionConfig.urlCache = cache
//let session = URLSession(configuration: sessionConfig)
注意别把那个缓存策略和这个缓存对象弄混,一个是策略,方案,一个是管理者,管理者会按照设置的缓存策略来管理缓存。我们可以获取到这个缓存对象,进行清理操作
let storage = URLCache.shared
print("内存memoryCapacity", storage.memoryCapacity)//默认52k
print("磁盘diskCapacity", storage.diskCapacity) //默认10MB
//单独清理某个请求的缓存
//storage.removeCachedResponse(for: <#T##URLRequest#>)
//根据时间清理
//storage.removeCachedResponses(since: <#T##Date#>)
//清理所有缓存,即下次请求时,会请求新的全部资源
storage.removeAllCachedResponses()
当我们使用了缓存时,因为我们设置了缓存大小,URLCache会帮我们自动管理缓存,我们无需关心塔什么时候自动清理,
同时,官方称,
1、缓存清理会在app非活跃状态进行,不会对app使用造成干扰
2、它是线程安全的
app的Caches目录下会创建一个和bundleId同名的文件夹,里面就是我们缓存的数据,其中fsCachedData是我们缓存的图片数据
Cookie操作
let storage = HTTPCookieStorage.shared
//设置cookie策略,是否接受cookie
storage.cookieAcceptPolicy = .always
//某个url的cookie
//storage.cookies(for: <#T##URL#>)
//删除
//storage.deleteCookie(<#T##cookie: HTTPCookie##HTTPCookie#>)
//删除指定日期cookie
//storage.removeCookies(since: <#T##Date#>)
//添加cookie
//storage.setCookie(<#T##cookie: HTTPCookie##HTTPCookie#>)
//排序
//storage.sortedCookies(using: <#T##[NSSortDescriptor]#>)
优化方案
1、尽量使用 GET 请求,iOS 系统 SDK 会自动帮你做缓存。你需要的仅仅是设置下内存缓存大小、磁盘缓存大小、以及缓存路径
2、Web资源离线加载,也可以把整个web页缓存起来,下次请求时根据url或者加载的配置来判断否请求网络,但只实适用固定不变的页面
3、通常webview首次加载非常慢,使用Native网络请求会很快
4、离线包+预加载(静态HTML、静态JS、静态CSS它们的加载、它们离线的东西),首屏进入可直接加载默认数据
5、如果页面样式结构比较固定,则可以采用自己的自己封装的网络请求去获取数据,然后拼接成HTML显示.
6、sokect加载资源