iOS网络开发(5)请求的缓存-创新互联
有网络请求的App有可能出现两个问题:
章贡ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为成都创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18982081108(备注:SSL证书合作)期待与您的合作!1)遇到网络不畅或数据量较大的情况下,会出现由于数据到达不及时使用不流畅的问题
2)频繁发送网络请求,可能造成没必要的流量产生以及拖累手机速度的问题
针对问题一,通常采用的策略是:延迟加载大数据的请求
针对问题二,通常采用适当的缓存策略,节省网络开销
延迟加载
在网络请求中,比较大的资源,如图片、视频等,需要做一些特殊处理以提升App的性能
如以下场景:
请求一个列表数据,每个数据包含:字符串、图片URL,tableView中需要显示这些数据
这里设计到多次请求,第一个请求得到列表数据,之后多次请求下载所有图片。
如果当所有数据全部加载后再进行UI显示,图片的下载是非常耗时的,影响到App的体验。
解决方案:
当第一次请求获得列表数据后,即将所有数据显示出来,图片显示的位置显示一个占位图片
使用异步的网络请求下载图片资源,当图片被下载之后立刻更新UI进行处理
示例说明:
a. 发送一个GET请求数据获一定数量的游戏人物信息
b. UITableView的数据源方法
可以看到单元格cell为其模型属性heroModel赋值的内容是网络请求后的模型数据
c. 单元格模型属性的setter方法
先看未使用延迟加载前的代码:
最后图片的显示,直接使用的同步方式请求,由于图片资源较大,UI界面会出现卡顿的情况
改用延迟加载后的代码:
先显示一个占位图片,然后异步请求图片资源,请求完成后再显示图片
这样做,即使网络不畅或图片较大时也不会出现UI界面卡顿的情况
缓存的引入
上面的解决方案,在一定情况下提升了用户的体验,但针对tableView来说,性能上可能还存在一定的问题:当tableView上下拖动过程中,会产生tableView的重用机制,意味着上面的代码将会重复执行,也就意味着下载图片的网络请求将重复发送
磁盘缓存:
在第一次请求时,将请求的结果存储在本地,下一次发送同一请求时,直接从本地获取缓存即可
缓存的使用:
对于需要频繁加载的数据,应使用本地缓存
对于服务器经常会更新的数据,不应使用本地缓存
对于服务器偶尔会更新的数据,应修改该缓存策略
NSURLRequest的缓存机制
在创建请求对象时可以指定使用的缓存策略
+ (instancetype)requestWithURL:(NSURL *)theURL cachePolicy:(NSURLRequestCachePolicy)cachePolicy timeoutInterval:(NSTimeInterval)timeoutInterval @property(readonly) NSURLRequestCachePolicy cachePolicy enum{ NSURLRequestUseProtocolCachePolicy = 0, //使用协议的缓存策略 NSURLRequestReloadIgnoringLocalCacheData = 1, //不使用本地缓存 NSURLRequestReturnCacheDataElseLoad = 2, //使用磁盘缓存 NSURLRequestReturnCacheDataDontLoad = 3, //只使用磁盘缓存,不进行网络加载 }; typedef NSUInteger NSURLRequestCachePolicy;
上面的延迟加载实例中:
请求任务数据应当使用NSURLRequestReloadIgnoringLocalCacheData方式
延迟加载图片应使用NSURLRequestReturnCachedDataElseLoad方式:
NSURLCache缓存策略
请求的缓存数据,通过NSURLCache管理
全局对象:
+ (NSURLCache *)sharedURLCache
获得缓存对象
- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request
缓存对象NSCachedURLResponse的属性
@property(readonly, copy) NSData *data @property(readonly, copy) NSURLResponse *response
清理缓存数据
- (void)removeCachedResponseForRequest:(NSURLRequest *)request - (void)removeAllCachedResponses
App中通常需要,定期清理缓存
通过NSURLCache对象可以管理缓存的空间,缓存的控件可以是内存,也可以是磁盘
@property(readonly) NSUInteger currentDiskUsage @property NSUInteger diskCapacity @property(readonly) NSUInteger currentMemoryUsage @property NSUInteger memoryCapacity
示例说明:
在AppDelegate中添加代码,每5分钟检测一次磁盘缓存的占用是否超过一半,如果是则发出缓存需要清理的通知(当然,也可以直接进行清理)
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
当前文章:iOS网络开发(5)请求的缓存-创新互联
转载来源:http://hbruida.cn/article/ccppep.html