weex 在 iOS 上如何实现常见的网络缓存

摘要: weex 旨在兼顾web动态性与native的用户体验,如果想将两者的优势最大化,那么缓存就显得格外重要,本文介绍如何利用缓存,实现weex页面迅速打开,甚至“秒开”的效果。

点此查看原文:http://click.aliyun.com/m/43049/

作者:阿里云-移动云-大前端团队

前言

weex 旨在兼顾web动态性与native的用户体验,如果想将两者的优势最大化,那么缓存就显得格外重要,本文介绍如何利用缓存,实现weex页面迅速打开,甚至“秒开”的效果。

正文

要实现 native 端的缓存,需要两个层面:
  • JS 文件缓存
  • request 请求缓存

单纯缓存JS文件是没用的,除非你的JS文件是hello world级别:不会在JS内部进行网络请求加载其他资源。有人说我的JS也有网络请求,请求了一张图片,也是可以的呀?十有八九那是 SDWebImage 功劳,那是你实现了图片加载的协议,SDWebImage已经帮你做了缓存了。
下面详细来看下如何让 weex 在 iOS 上支持常见的网络缓存:

JS 文件缓存

大致有两种思路:
  • 预加载类型:在启动后,客户端主动到服务端拉取会用到JS并缓存。这样下次用到该JS文件事即可实现“秒开”。
  • 类似于传统的网络缓存类型:第一次加载该JS文件时,需要通过网络加载,下次访问时就可以不走网络,需要设置cache策略。

预加载方式也是常见的缓存方式,启动后预先加载,在此不做赘述。
第二种类型,有一篇文章已经有比较详细的论述:
  • 《Weex的JS缓存实现》

具体的思路用流程图表示如下:
具体的步骤如下:
  • 下载JS前重写renderByUrl
  • 渲染时重写render
  • 在页面使用自定义WXSDKInstance替换原WXSDKInstance

第一步 下载JS前重写renderByUrl
在拿到服务端JS的url后,首先判断是否有本地JS缓存,若有则对比本地JS及服务端JS的MD5进行校验,校验通过则直接使用本地JS,否则按原计划下载服务端JS。Weex支持使用本地JS文件。
@Overridepublic void renderByUrl(String pageName, String url, Map<String, Object> options, String jsonInitData, WXRenderStrategy flag) { String local = ""; if(TextUtils.isEmpty(url) || md5Check(url)){ local = getLocalJs();//获取本地JS路径 } if(!TextUtils.isEmpty(local){ super.renderByUrl(pageName, local, options, jsonInitData, flag); }else { super.renderByUrl(pageName, url, options, jsonInitData, flag); }}/*** 获取本地JS路径*/private String getLocalJs(){ try { File f = new File(context.getFilesDir(), "local_js.txt"); if(f.exists()) { return "file://" + f.getAbsolutePath(); } } catch (Exception e) { } return "";}

第二步 渲染时重写render

JS文件获取成功后,若是从服务端下载的JS,则需要进行文件缓存。
@Overridepublic void render(String pageName, String template, Map<String, Object> options, String jsonInitData, WXRenderStrategy flag) { saveWeexFile(template); super.render(pageName, template, options, jsonInitData, flag);}/*** 异步存储JS Bundle RX实现* @param template*/private void saveWeexFile(String template){ if(isLocalFile(getBundleUrl())){ return; } Observable .just(template) .map(new Function<String, Boolean>() { @Override public Boolean apply(String s) throws Exception { //weex对文件名不敏感,存txt文件 return FileUtil.saveFile(context.getFilesDir().getAbsolutePath(), "local_js.txt", s.getBytes("UTF-8")); } }) .subscribeOn(Schedulers.io()) .subscribe(new Consumer<Boolean>() { @Override public void accept(Boolean aBoolean) throws Exception { if(aBoolean){ //缓存成功 } } },new Consumer<Throwable>(){ @Override public void accept(Throwable throwable) throws Exception { throwable.printStackTrace(); } }); }/*** 异步存储JS Bundle* @param template*/private void saveWeexFile(String template){ if(isLocalFile(getBundleUrl())){ return; } Thread thread = new Thread( new Runnable(){ @Override public void run(){ FileUtil.saveFile(context.getFilesDir().getAbsolutePath(), "local_js.txt", template.getBytes("UTF-8")); } }); thread.start();}/*** 判断是本地文件还是网络url*/private boolean isLocalFile(String url){ if(TextUtils.isEmpty(url){ return false; } Uri uri = Uri.parse(url); if (uri != null && TextUtils.equals(uri.getScheme(), "file")) { return true; } return false;}

第三步 在页面使用自定义WXSDKInstance替换原WXSDKInstance
注意:如果weex页面更新不频繁,就没必要每次都进行文件校验。每次启动app只进行一次文件校验并缓存MD5,后续打开页面进行本地MD5校验。

request 缓存

上面介绍的是JS的缓存,但是 JS 文件缓存后,还是无法实现无网络状况下,直接打开 JS 页面,JS 页面还有大量的资源文件,JS 文件内部还是会发送网络请求,这些网络请求依然需要用到缓存策略。

这个部分的缓存基本的思路如下:
  • 与传统的缓存是一样的。
  • 添加一个缓存方式:先缓存后网络。

weex的网络请求部分,可以设置扩展,设置后,所有的weex SDK的网络请求都会经由该扩展处理,所以request部分的请求,实际上与传统的缓存是一样的。比如我们熟悉的NSCache、YYCache等第三方的网络请求方式也是可以复用的。

识别以下二维码,干货

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/522600.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python实现多智能体一致性_促进产学研,多智能体协同控制——科研与实践教学齐飞...

对多智能体感兴趣欢迎Wangzaixiaolatiao&#xff08;VX&#xff09;沟通。一、引言1.1、概述多智能体协同控制系统即多个智能体组成的集合&#xff0c;它的目标是将大而复杂的系统集成设成小的、彼此互相通信和协调的、易于管理的系统。多智能体协同控制系统在表达实际系统时&a…

android 汇编 参数,安卓ARM汇编基础知识

ARM 是 Advanced RISC Machine 的缩写&#xff0c;可以理解为一种处理器的架构&#xff0c;还可以将它作为一套完整的处理器指令集。RISC(Reduced Instruction Set Computing) 精简指令集计算机&#xff1a;一种执行较少类型计算机指令的微处理器。处理器指令集: 计算机处理命令…

移动推送消息送达常见问题与解决办法

摘要&#xff1a; 一、 收到重复的推送内容 * 收到重复的推送内容&#xff0c;排除了业务自身的推送逻辑之外&#xff0c;重点介绍一下部分机型多渠道推送可能带来的重复推送问题。 * 对于Android系统&#xff0c;对于设备已经在某些三方系统中注册过&#xff0c;并且通过该三方…

帮助你驾驭 Kubernetes 的 4 个工具 | Linux 中国

学习如何驾驭 Kubernetes 比如何建造它更重要&#xff0c;这些工具可以帮助你更快上路。-- Scott Mccarty译者|Xinyu Wang来源|Linux中国在本系列的第三篇文章中&#xff0c;Kubernetes 基础&#xff1a;首先学习如何使用&#xff0c;我强调你应该学会使用 Kubernetes&#xff…

三大新功能发布 阿里云短视频SDK玩法多 优惠更多

摘要&#xff1a; 近日&#xff0c;阿里云短视频SDK进行了重大升级&#xff0c;对视频滤镜和视频特效方面进行了功能更新&#xff0c;助力用户快速接入带来更多的玩法。 短视频SDK介绍 短视频SDK提供短视频录制、导入和编辑的高级功能&#xff0c;支持多种分辨率选择、实时美颜…

html asp 日历_全球第一本《2021世界艺术日历》,正式发售!

原标题&#xff1a;全球第一本《2021世界艺术日历》&#xff0c;正式发售&#xff01;艺术&#xff0c;人类精神文明的美丽结晶。作为一名资深艺术爱好者&#xff0c;多希望 每天都能和名画为伴&#xff0c;接受各个时期艺术佳作的熏陶。 记得2020年的开头&#xff0c; 我买了好…

三星计划替换所有日产半导体材料;美企过度响应“禁令”,华为被曝祭出数亿索赔;苹果iPhone 11发布日期刚刚泄露...

戳蓝字“CSDN云计算”关注我们哦&#xff01;嗨&#xff0c;大家好&#xff0c;重磅君带来的【云重磅】特别栏目&#xff0c;如期而至&#xff0c;每周五第一时间为大家带来重磅新闻。把握技术风向标&#xff0c;了解行业应用与实践&#xff0c;就交给我重磅君吧&#xff01;重…

button hover逐渐变色_两当水库界桩@产品长久不变色 - 两当安全防护

河北合诺电力设备有限公司成立于2009年&#xff0c;位于河北省石家庄市新华区&#xff0c;是一家富有高科技生产力与完善服务体系的综合性企业。公司集科研、生产、销售及服务于一体&#xff0c;厂区占地50余亩&#xff0c;现有员工135人&#xff0c;专业资质技术人员26人&…

I+关系网络分析发布,提供完整的可视化分析和关系引擎功能

摘要&#xff1a; I关系网络分析是以OLP模型为核心&#xff0c;面向业务快速建模&#xff0c;为开发者和终端用户提供大数据关系计算引擎&#xff08;含API服务&#xff09;和可视化交互分析能力&#xff0c;面向安防、关税、银行、保险、互联网等提供的产品化方案。目前&#…

赞,全网开发者都在学的 26 门 AI 课程!

整理 | Jane出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;免费的在线学习课程一直是大多数人学习 AI 知识和技能的方式之一。今天&#xff0c;基于 Github 上一位小姐姐 Chip Huyen 分享的 10 门机器学习课程&#xff0c;AI科技大本营将这份收藏大礼包进…

结构损伤检测与智能诊断 陈长征_宿迁厂房安全检测多少钱介绍说明

检测与鉴定1. 混凝土类材料(混凝土试块和混凝土芯样抗压强度、砂浆试块抗压强度)试验&#xff1b;2. 钢筋及接头(钢筋原材和焊接接头、钢筋后锚固件)力学工艺性能试验&#xff1b;3. 混凝土结构检测混凝土预制构件结构性能检测、钻芯法检测混凝土强度、混凝土回弹法检测强度、钢…

阿里云ECS开放批量创建实例接口,实现弹性资源的创建

摘要&#xff1a;为了更方便的实现弹性的资源创建&#xff0c;方便用户一次运行多台ECS按量实例来完成应用的开发和部署&#xff0c;阿里云开放了ECS的批量创建实例接口RunInstances&#xff0c;可以单次最多创建100台实例&#xff0c;避免重复调用和创建。点此查看原文&#x…

项目是如何死掉的?太过真实!

戳蓝字“CSDN云计算”关注我们哦&#xff01;做项目多年&#xff0c;见过成功的项目&#xff0c;也见过太多失败的项目&#xff1b;成功或失败&#xff0c;都是项目的宿命。我总结了项目失败的几点要素&#xff0c;供有志于将项目做失败的同学参考。绝大多数人在面对失败的可能…

igmp是哪个层协议_通俗易懂网络协议(IP)

之前写过一篇《通俗易懂TCP/IP(概述)》&#xff0c;广受欢迎和好评&#xff0c;有网友催更&#xff0c;便抽空续写IP章节&#xff0c;回应粉丝期待。TCP/IP网络模型TCP/IP网络模型分为4层&#xff0c;自下而上分布为链路层(又叫网络接口层)、网络层、传输层、应用层。链路层&am…

opporeno3pro可以刷鸿蒙系统吗,华为P40放大招!鸿蒙系统+120Hz+徕卡五摄,明年2月发布!...

自OPPO副总裁沈义人在微博上多番爆料后&#xff0c;机粉们对于OPPO Reno3 Pro的期待值上升到了一个新高度。在期待了近一个月后&#xff0c;12月26日&#xff0c;全新OPPO Reno3系列将正式发布——OPPO Reno3 Pro这次真的来了&#xff01;而与此同时&#xff0c;OPPO也在近期官…

三款新功能发布,助力阿里云表格存储再次升级

摘要&#xff1a;阿里云表格存储于近期功能再升级&#xff0c;升级后的表格存储支持对DataHub采集的数据进行持久化存储&#xff0c;其Python SDK新增支持Python 3.x&#xff0c;以及最新发布的TimelineLib能够帮助用户轻松构建千万级IM和Feed流系统。点此查看原文&#xff1a;…

基于阿里云实现游戏数据运营(附Demo)

摘要&#xff1a; 原作者&#xff1a;阿里云解决方案架构师&#xff0c;陆宝。通过阅读本文&#xff0c;您可以学会怎样使用阿里云的maxcompute搭建一套数据分析系统。一、总览一个游戏/系统的业务数据分析&#xff0c;总体可以分为图示的几个关键步骤&#xff1a;1、数据采集&…

正式发布!鸿蒙,来了!

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 胡巍巍 发自东莞篮球中心出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;鸿蒙真的来了&#xff01;余承东宣布&#xff0c;鸿蒙的英文名叫HarmonyOS&#xff01;对于华为来讲&#xff0c;8月9日是华为开发者大会…

手机屏坏了怎么把里面存东西取出来_手机又卡了,到底是运行不够还是存储容量不足?1分钟搞懂...

现在的主流旗舰机个个都是6128GB起步了&#xff0c;如果手机卡了&#xff0c;是运行内存不够&#xff1f;还是存储容量不足&#xff1f;事实上&#xff0c;很多人都没搞清楚&#xff0c;机身内存和运行内存&#xff0c;其实是两码事。运行内存和机身内存有什么区别&#xff1f;…

在 React 工程中利用 Mota 编写面向对象的业务模型

摘要&#xff1a; ## 简述 React 是一个「视图层」的 UI 框架&#xff0c;以常见的 MVC 来讲 React 仅是 View&#xff0c;而我们在编写应用时&#xff0c;通常还需要关注更加重要的 model&#xff0c;对于 React 来讲&#xff0c;我们常常需要一个「状态管理」库。然而&#x…