如何在 React Native 中将事件从 iOS 发送到 javascript

Art*_*ang 3 javascript objective-c ios react-native

我正在 iOS 应用程序中做一些异步操作。它是由 javascript 触发的。完成后(在应用程序中的某个地方分开),我想让 javascript 知道。我当前的解决方案是继承自 的本机模块RCTEventEmitter,它具有以下方法:

@interface MyEventEmitter : RCTEventEmitter
// ...
end
@implementation
- (void)giveSomethingToJS:(NSString *)something {
  [self sendEventWithName:@"SOME_NAME" body:something];
}
@end
Run Code Online (Sandbox Code Playgroud)

然后,当我的异步工作完成后,我调用这个方法:

MyEventEmitter *emitter = [[MyEventEmitter alloc] init];
[emitter giveSomethingToJS:@{}];
Run Code Online (Sandbox Code Playgroud)

很明显,emitter.bridge是 nil 并且应用程序因为 assert 崩溃了bridge != nil。那么我应该如何获得桥梁并让*emitter(实例)知道。或者如何在桥初始化的情况下获得正确的实例?

提前致谢!

Bra*_*sse 5

问题是在 React-Native iOS SDK 中,RCTEventEmitter子类不应由您初始化。React-Native SDK 实际上处理 RCTEventEmitters 的初始化。

正如 Arthur 所指出的,NSNotificationCenter用来与您沟通RCTEventEmitter是一个很好的策略。如果您需要指向这些事件发射器的指针,您还可以创建一个自定义的单例类并在初始化时使用它注册 RCTEventEmitter。


Art*_*ang 1

我有一个快速解决方案,不是一个很好的主意,但实现了我想要的。

问题是我无法获取 的实例MyEventEmitter,因此我改为在本机代码中使用通知中心来通知实例。

[[NSNotificationCenter defaultCenter] addObserverForName:@"NATIVE_WEIXIN_LOGIN_RESP_CODE"
                                                  object:nil
                                                  queue:nil
                                             usingBlock:^(NSNotification * _Nonnull notification) {
                                               SendAuthResp *resp = notification.object;
                                                 [self sendEventWithName:@"WEIXIN_LOGIN_RESP_CODE" body:resp.code];
                                               }];
Run Code Online (Sandbox Code Playgroud)

您仍然可以在 React Native 中发布正确的方法来完成我想要的事情吗?