90

iOS动态功能部署我们是这样实现的—使用优化篇

 6 years ago
source link: http://mp.weixin.qq.com/s/vW4RMPTOkTlLmQcXqv4dSw
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

iOS动态功能部署我们是这样实现的—使用优化篇

郭鹏@客户端技术 58招聘技术团队 2017-11-21 02:18 Posted on

Image

一、概述

       关于NJCS的使用优化,主要体现在方法调用上,也就是js调用Native的方法。NJCS内方法的调用有两种方式:1、链式调用,2、簇调用,下面将对这两种方式分别进行说明。

二、方法调用说明

       1、链式调用

        代码示例:

        var tableView = UITableView.alloc().init();

       这一行代码的意思是初始化tableView,链式调用也就是点语法,方法可以一直调用下去,但问题的关键在于每一次的方法调用都是js跟Native的交互,而NJCS内js调Native方法有一个统一的入口:

Image

        因此就需要把链式语法中的每一次方法调用都转成该统一的入口,我们采用的方案是在注入js之前用正则表达式替换。

大概流程图如下:

Image

        其中正则表达式为:

Image

        替换前代码如下:

Image

 替换后代码如下:

Image

正则匹配后会调用runNative方法,方法如下:

Image

        该方法所做的事情为拿到Native对象、selectorName、方法参数,然后调用

    bridgeJS.runNativeMethodWithTargetMethodNameAndParameters()利用反射机制来调Native的方法。

        说明:如果调用的方法里有参数的话,OC里的selector方法名是会含有:的,所以在js里调用Native的方法时,如果需要传参数且参数个数为一个,则直接把参数写在括号里,runNative方法会自动在方法后面添加一个冒号,如果含有多个参数,为了与OC相对应,则需要在方法里用下划线来分割方法名,runNative会自动替换成下面的格式

Image

        采用链式调用的优点:写js代码的时候方便,使用者不必关心底层的原理,只在上层用点语法调用方法就行了。

        2、簇调用    

        代码示例:

Image

        簇调用的意思就是批量调用方法,然后给Native统一处理。

        流程如下:

        (1)、把单个的调用命令用componentCMD_JS.create()封装成自定义的格式componentCMD_JS。其中componentCMD_JS数据结构如下:

Image

        参数介绍:

        component:被操作的对象,这个对象既可以是Native返 回的亦可以是JS封装后的实例

        childInstanceName:component的子组件,如果为“”则被操作对象既为

component本身

        methodName:方法的名字

        parameters:参数

        (2)、将命令放到cmds数组里

        (3)、然后调用bridgeJS.sendCMDTOComponents(cmds);把这一批命令发送到Native,然后Native对数组遍历,在对自定义封装的类型解析,逐条执行命令。

        簇调用的好处:在一次簇调用过程中js跟Native只交互一次,避免单次调用对性能的损耗(注:NJCS所有的js跟Native交互都是发生在主线程的,如果交互太频繁会影响界面的渲染速度,从而影响用户体验度)。

三、后续优化

        1、现有的NJCS框架里,关于Button的点击事件实现的思路是给`Button添加一个不存在的方法,然后通过消息转发的方式实现的。走消息转发的话需要走3步,而这是会有性能问题的,有一个解决方案就是使用代理,这个后续将会进行改善。

        2、另一个优化点是关于js代码下发的流程优化,现有框架还没有成熟的下发流程,之后将会对整个流程规范。

Image

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK