OC主动向RN发送事件



  • 遇到两个问题。
    1.使用官网文档的说明,创建对象继承自RCTEventEmitter,
    在运行
    [self sendEventWithName:@"EventReminder" body:@{@"name": eventName}];
    方法时,报错bridge为空。
    2.我解决了问题1,但不知解决方式是否正确,因此提出问题1。在
    [self sendEventWithName:@"EventReminder" body:@{@"name": eventName}];
    发送出消息之后,rn使用NativeEventEmitter实例去创建监听器,监听器不起作用,OC中提示消息已发送,但是没有对应的监听器监听
    有老哥写过相应的demo吗,求一份学习一下。。



  • 这个bridge 需要在创建rootView的时候进行一次赋值的。(这个是我看见stackflow上面的一些建议)
    代码例子如下:
    RCTRootView *rootView =
    [[RCTRootView alloc] initWithBundleURL : jsCodeLocation
    moduleName : @"AwesomeProject"
    initialProperties : @{}
    launchOptions : nil];
    RNBaseViewController *vc = [[RNBaseViewController alloc] init];
    vc.view = rootView;

    [[RNNativeManager shareInstance] setBridge:rootView.bridge];
    

    但是有一个问题,这个对象,并不是想JS环境注册的对象,我也不知道改什么处理了。
    欢迎更多的朋友进来一起讨论!



  • 我说的我解决了问题1就是这么解决的,但是这么做你会发现一个很迷的事,你在rn里监听不到这个事件。原生会告诉你没有监听器监听。



  • @XingXiaoWu 说:

    但是这么做你会发现一个很迷的事,你在rn里监听不到

    确实会监听不到,原因是RN的RCT_EXPORT_MODULE会默认创建一个对象,你自己也创建了一个新的对象,这样是两个对象,不是同一个。所以会收不到信息。我也遇到这样的问题,不知道怎么解决了。。。。



  • 兄弟这样处理OK:
    1、重新allocWithZone这个方法
    +(id)allocWithZone:(NSZone *)zone {
    static RNEventEmitter *sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
    sharedInstance = [super allocWithZone:zone];
    });
    return sharedInstance;
    }
    2、在创建rootView的时候,将bridge赋值给则个module的bridge



  • @aliyunyun 谢谢老哥了