一般而言,objA 調(diào)用 objB的function,起點(diǎn)在objA阅嘶。objA 調(diào)起指定對(duì)象(如objB)的function。
目前RN版本為0.30载迄,根據(jù)0.30版本文檔上介紹的方法讯柔,該功能通過(guò)RCTEventDispatcher來(lái)實(shí)現(xiàn),可是在API中這個(gè)方法已經(jīng)deprecate了护昧,并提示使用RCTEventEmitter魂迄,一個(gè)抽象基類來(lái)完成。
RCTEventEmitter 定義如下:
@interface RCTEventEmitter : NSObject <RCTBridgeModule>
官方網(wǎng)站沒(méi)有相關(guān)文檔說(shuō)明惋耙,且網(wǎng)上的資料非常之少捣炬。
通過(guò)研究api后發(fā)現(xiàn)一些思緒。
native端
1.1. 子類化RCTEventEmitter
1.2. 實(shí)現(xiàn)
- (NSArray<NSString *> *)supportedEvents
{
return @[@"nativeCallJS"];
}
1.3. 調(diào)用
[self sendEventWithName:@"nativeCallJS" body:nil];
js端
2.1. 聲明變量
const myModuleEvt = new NativeEventEmitter(NativeModules.RNEventEmitter);
2.2. 監(jiān)聽(tīng)
myModuleEvt.addListener('nativeCallJS',
(data) => console.log(data));
2.3. 實(shí)現(xiàn)nativeCallJS方法
nativeCallJS()
{
console.log('RN1');
alert('1');
}
問(wèn)題在于绽榛,myModuleEvt變量在js端生成湿酸,而不是native端∶鹈溃可見(jiàn)該流程的起源在js端推溃。在源碼里RCTSRWebSocket,RCTWebSocketModule關(guān)于RCTEventEmitter的實(shí)現(xiàn)也能證明這一點(diǎn)届腐。
所以铁坎,嚴(yán)格來(lái)說(shuō),RN不支持線性的native 調(diào)用js(可能支持通知形式的native調(diào)js)犁苏。
而且硬萍,要完成這一流程,還少了關(guān)鍵的一環(huán)围详,js調(diào)起native方法朴乖,并傳入RCTEventEmitter變量,由該變量實(shí)現(xiàn)native調(diào)用js短曾。
1.3 實(shí)現(xiàn)方式為:
RCT_EXPORT_METHOD(processData:(id)data)
{
//native process
…
// native call js
[self sendEventWithName:@"nativeCallJS" body:nil];
}
時(shí)序圖如下