close
当前位置: 物联网在线 > 技术文库 > ios >

Weex 是如何在 iOS 客户端上跑起来的(9)

WXSDKEngine会默认注册这15种基础模块。这里就以比较复杂的模块WXWebSocketModule为例,来看看它是如何被注册的。

+ (void)registerModule:(NSString *)name withClass:(Class)clazz { WXAssert(name && clazz, @"Fail to register the module, please check if the parameters are correct !"); // 1. WXModuleFactory注册模块 NSString *moduleName = [WXModuleFactory registerModule:name withClass:clazz]; // 2.遍历所有同步和异步方法 NSDictionary *dict = [WXModuleFactory moduleMethodMapsWithName:moduleName]; // 3.把模块注册到WXBridgeManager中 [[WXSDKManager bridgeMgr] registerModules:dict]; }

注册模块也分3步,第一步是在WXModuleFactory中注册。

@interface WXModuleFactory () @property (nonatomic, strong) NSMutableDictionary *moduleMap; @property (nonatomic, strong) NSLock *moduleLock; @end

在WXModuleFactory中,moduleMap会存储所有的模块的配置信息,注册的过程也是生成moduleMap的过程。

- (NSString *)_registerModule:(NSString *)name withClass:(Class)clazz { WXAssert(name && clazz, @"Fail to register the module, please check if the parameters are correct !"); [_moduleLock lock]; // 这里需要注意的是:注册模块是允许同名模块的 WXModuleConfig *config = [[WXModuleConfig alloc] init]; config.name = name; config.clazz = NSStringFromClass(clazz); [config registerMethods]; [_moduleMap setValue:config forKey:name]; [_moduleLock unlock]; return name; }

整个注册的过程就是把WXModuleConfig为value,name为key,存入_moduleMap字典里。

@interface WXModuleConfig : WXInvocationConfig @end

WXModuleConfig仅仅只是继承自WXInvocationConfig,所以它和WXInvocationConfig是完全一样的。[config registerMethods]这个方法和注册组件的方法是同一个方法,具体注册流程这里就不再赘述了。

在WXModuleFactory中会记录下一个个的WXModuleConfig:

_moduleMap = { animation = "<WXModuleConfig: 0x60000024a230>"; canvas = "<WXModuleConfig: 0x608000259ce0>"; clipboard = "<WXModuleConfig: 0x608000259b30>"; dom = "<WXModuleConfig: 0x608000259440>"; event = "<WXModuleConfig: 0x60800025a280>"; globalEvent = "<WXModuleConfig: 0x60000024a560>"; instanceWrap = "<WXModuleConfig: 0x608000259a70>"; meta = "<WXModuleConfig: 0x60000024a7a0>"; modal = "<WXModuleConfig: 0x6080002597d0>"; navigator = "<WXModuleConfig: 0x600000249fc0>"; picker = "<WXModuleConfig: 0x608000259e60>"; storage = "<WXModuleConfig: 0x60000024a4a0>"; stream = "<WXModuleConfig: 0x6080002596e0>"; syncTest = "<WXModuleConfig: 0x60800025a520>"; timer = "<WXModuleConfig: 0x60000024a380>"; webSocket = "<WXModuleConfig: 0x608000259fb0>"; webview = "<WXModuleConfig: 0x6080002598f0>"; }

每个WXModuleConfig中会记录下所有的同步和异步的方法。

config.name = dom, config.clazz = WXDomModule, config.asyncMethods = { addElement = "addElement:element:atIndex:"; addEvent = "addEvent:event:"; addRule = "addRule:rule:"; createBody = "createBody:"; createFinish = createFinish; getComponentRect = "getComponentRect:callback:"; moveElement = "moveElement:parentRef:index:"; refreshFinish = refreshFinish; removeElement = "removeElement:"; removeEvent = "removeEvent:event:"; scrollToElement = "scrollToElement:options:"; updateAttrs = "updateAttrs:attrs:"; updateFinish = updateFinish; updateStyle = "updateStyle:styles:"; }, config.syncMethods = { }

第二步遍历所有的方法列表。

- (NSMutableDictionary *)_moduleMethodMapsWithName:(NSString *)name { NSMutableDictionary *dict = [NSMutableDictionary dictionary]; NSMutableArray *methods = [self _defaultModuleMethod]; [_moduleLock lock]; [dict setValue:methods forKey:name]; WXModuleConfig *config = _moduleMap[name]; void (^mBlock)(id, id, BOOL *) = ^(id mKey, id mObj, BOOL * mStop) { [methods addObject:mKey]; }; [config.syncMethods enumerateKeysAndObjectsUsingBlock:mBlock]; [config.asyncMethods enumerateKeysAndObjectsUsingBlock:mBlock]; [_moduleLock unlock]; return dict; }

这里遍历模块的方法列表和组件的有所不同。首先模块是有默认方法的。

- (NSMutableArray*)_defaultModuleMethod { return [NSMutableArray arrayWithObjects:@"addEventListener",@"removeAllEventListeners", nil]; }

所有的模块都有addEventListener和removeAllEventListeners方法。第二个不同就是模块会遍历所有的同步和异步方法,(组件只会遍历异步方法)。最终返回生成模块的所有方法的字典。


(责任编辑:ioter)

用户喜欢...

设计实例 #8:如何在整个热电偶测量范围内检测热电偶并准确检测温度

热电偶参考设计演示了如何在整个热电偶测量范围内检测热电偶并准确检测温度。 该解决方案使用MCP3421 18位模数转换器(ADC)测量热电偶两端的电压。ADC具有内部2.048V基准电压和可编程增益放...


如何在零信任世界中保护医疗保健物联网设备

ISTOCK 目前全球安装了超过1亿台医疗保健物联网设备,到2020年增长到1.61亿,根据Statista的数据,在短短三年内实现了17.2%的复合年增长率(CAGR)。 据埃森哲2017年健康互联网称,医疗保健管理...


如何在便携式设计的电池容量读数中实现更高的准确性

我的狗摩卡(图1)经常喜欢在徒步旅行期间跑到我前面进行一些越野探索。她总是在以后找到我,但有时我开始寻找她很久,所以我想找到一种方法来轻松追踪她的位置。通过Adafruit的展望网站...


数字双胞胎如何在物联网支持的环境中推动创新

动态数字表示或数字双胞胎正在迅速改变行业设计,构建和操作其产品和流程的方式。Gartner预测,到2021年,一半的大型工业公司将使用数字双子机,从而使这些机构的有效性得到10%的提高。...


电动汽车绝缘电阻如何在线检测?

电动汽车是一个复杂的机电一体化产品,其中的许多部件包括动力电池、电机、充电机、能量回收装置、辅助电池充...


对话赛灵思:33年老牌芯片厂如何在AI浪潮里新兴业务年增46%

随着移动互联网红利日渐式微,一个更具备颠覆性、更具备革命性的王朝正悄然来临——人工智能(AI)。在下一个十年里,云计算、机器学习、AI芯片等相关产业将以迅猛的势头持续占领市...


客户投诉器件功耗太大,“元凶”原来是它!

selina 在 周五, 11/24/2017 - 09:48 提交 为什么我的处理器功耗大于数据手册给出的值? 在之前的文章中,我们谈到了一个功耗过小的器件——是的,的确有这种情况——带来麻烦的事情。但这种...


SaaS:从功能、数据到生态以及客户成功的一场变革

不知不觉“终结软件”的呐喊已经走过了近二十年,SaaS已经走进千家万户,人们不再纠结是否要“终结软件”,也没...


华为客户荣获2017全球智慧城市博览会两项大奖两项提名奖

在2017年全球智慧城市博览会上,华为在智慧城市领域的四位客户以他们在提供高质量市民服务、实现可持续发展方面...


迈来芯宣布上线中文官方网站以加速融入中国市场,更好的服务中国客户

全球微电子技术公司——迈来芯(Melexis)宣布,定于2017年11月正式上线中文官方网站。迈来芯电子科技(上海)有限...