Skip to content

添加对CLLocationCoordinate2D 等结构,以及成员变量为结构的结构支持。

spy.liu@dji.com(刘江辉) edited this page Jun 29, 2016 · 3 revisions

主要思路是,将struct转为Dictionary而不是JPBoxing。

从OC传给JS时,需要修改JPForwardInvocation 的几处代码。

  1. 从OC调JS的参数转换时的处理。(JPForwardInvocation)*

for (NSUInteger i = 2; i < numberOfArguments; i++) { ... case '{': { //转换结构类型的参数给JS。 }

  1. 计算结构体大小。 添加 sizeOfStructTypes2 方法,传入 作为成员变量的结构体名称,递归去查询,最后返回整个结构体的大小。 比如 StructA有两个double,StructB有两个double; 而StructC由一个StructA和一个StructB组成,那么大小为 32.

  2. 将bytes转为NSDictionary。 getDictOfStruct 方法重写,添加 case '?': 的处理。

  3. 从JS调OC的参数转换时的处理。(callSelector) for (NSUInteger i = 2; i < numberOfArguments; i++) { ... case '{': { //针对部分Struct 如CLLocationCoordinate2D ,argumentType是 ?=dd, 根本无法知道结构类型,那么通过 “dd” type去自定义的Struct里搜索有相同的“types”字段的Struct,当做这个结构来处理。由于转换放入bytes里时只跟type有关,跟key的名称无关,因此不会有问题。 }

  4. 将Dictionary转换存入bytes。 getStructDataWithDict 方法添加 case '?': 的处理。

结构定义方式:

对于CLLocationCoordinate2D 这类结构,直接在JS脚本里定义即可,如:

require('JPEngine').defineStruct({ "name": "CLLocationCoordinate2D", "types": "dd", "keys": ["latitude", "longitude"] });

对于带有结构类型成员的结构体,定义如下:

require('JPEngine').defineStruct({ "name": "TestA", "types": "dd", "keys": ["a", "b"] });

require('JPEngine').defineStruct({ "name": "TestB", "types": "dd", "keys": ["c", "d"] });

require('JPEngine').defineStruct({ "name": "TestS", "types": "??", "keys": ["aa", "bb"], "sub" :"TestA,TestB" });

Clone this wiki locally