iOS网络开发(5)请求的缓存

有网络请求的App有可能出现两个问题:

创新互联建站长期为超过千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为淮阴企业提供专业的网站制作、网站设计,淮阴网站改版等技术服务。拥有十余年丰富建站经验和众多成功案例,为您定制开发。

    1)遇到网络不畅或数据量较大的情况下,会出现由于数据到达不及时使用不流畅的问题

    2)频繁发送网络请求,可能造成没必要的流量产生以及拖累手机速度的问题

针对问题一,通常采用的策略是:延迟加载大数据的请求

针对问题二,通常采用适当的缓存策略,节省网络开销

  • 延迟加载

在网络请求中,比较大的资源,如图片、视频等,需要做一些特殊处理以提升App的性能

如以下场景:

     请求一个列表数据,每个数据包含:字符串、图片URL,tableView中需要显示这些数据

     这里设计到多次请求,第一个请求得到列表数据,之后多次请求下载所有图片。

     如果当所有数据全部加载后再进行UI显示,图片的下载是非常耗时的,影响到App的体验。

解决方案:

     当第一次请求获得列表数据后,即将所有数据显示出来,图片显示的位置显示一个占位图片

     使用异步的网络请求下载图片资源,当图片被下载之后立刻更新UI进行处理

示例说明:

    a. 发送一个GET请求数据获一定数量的游戏人物信息

    iOS网络开发(5)请求的缓存

    b. UITableView的数据源方法

    iOS网络开发(5)请求的缓存 

        可以看到单元格cell为其模型属性heroModel赋值的内容是网络请求后的模型数据

    c. 单元格模型属性的setter方法

    先看未使用延迟加载前的代码:

    iOS网络开发(5)请求的缓存

        最后图片的显示,直接使用的同步方式请求,由于图片资源较大,UI界面会出现卡顿的情况

    改用延迟加载后的代码:

    iOS网络开发(5)请求的缓存

        先显示一个占位图片,然后异步请求图片资源,请求完成后再显示图片

        这样做,即使网络不畅或图片较大时也不会出现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方式

    iOS网络开发(5)请求的缓存

    延迟加载图片应使用NSURLRequestReturnCachedDataElseLoad方式:

    iOS网络开发(5)请求的缓存

  • 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分钟检测一次磁盘缓存的占用是否超过一半,如果是则发出缓存需要清理的通知(当然,也可以直接进行清理)

    iOS网络开发(5)请求的缓存

新闻名称:iOS网络开发(5)请求的缓存
文章地址:https://www.cdcxhl.com/article28/jpocjp.html

成都网站建设公司_创新互联,为您提供域名注册做网站外贸网站建设网站营销外贸建站企业网站制作

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

绵阳服务器托管