此问题与self.bridge的症状无关。虽然我做了@synthesize bridge = _bridge,但在处理来自JavaScript方面的事件时,bridge属性为零,这是意外的。
通过检查和网上冲浪,我发现原因:对于RCTBridgeModule,对象的生命周期很难通过objective-c代码来控制。有关桥接模块的最佳做法是忘记其生命周期的所有细节,并且不要对其生命周期做出任何假设。因此,如果您自己创建了网桥模块(可能使用[MyBridge new]
),则应用程序中可能会有两个不同的网桥对象。你不能确定哪个对象是从JavaScript端接收事件的人。
因此,我现在使用下面的解决方案。
@implementation EventBridge
@synthesize bridge = _bridge;
RCT_EXPORT_MODULE();
- (instancetype) init {
self = [super init];
if (self) {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(cartUpdateNotification:)
name:kCartUpdateNotification
object:nil];
}
return self;
}
+ (void) addObserver:(id)observer selector:(SEL)selector {
[[NSNotificationCenter defaultCenter] addObserver:observer
selector:selector
name:kMenuClickNotification
object:nil];
}
/*
* objc -> js call
*/
+ (void) postEventWithName:(NSString *)name object:(id)object {
[[NSNotificationCenter defaultCenter]
postNotification:[NSNotification notificationWithName:name
object:object]];
}
/*
* js -> objc call when the hamburger is clicked
*/
RCT_EXPORT_METHOD(menuClicked)
{
// This method might be called on the different TopNavViewController object.
[[NSNotificationCenter defaultCenter] postNotificationName:kMenuClickNotification
object:nil];
}
- (void) cartUpdateNotification:(NSNotification*)notification {
[self.bridge.eventDispatcher sendAppEventWithName:@"CartUpdated" body:@{@"item":notification.object}];
}
@end