在React Native桥上调用方法时,Bridge是nil,使用单例?

时间:2015-11-30 22:51:15

标签: ios objective-c react-native

我正在创建自己的自定义组件,以便与蓝牙设备进行交互。 I tried this in Swift,但由于访问桥梁问题而无法到达任何地方。

我在Objective-C中重新实现了它并遇到了同样的问题(bridge = nil)。为了解决这个问题,我使用了:

BTAdapter.h

#import "RCTBridgeModule.h"

@interface BTAdapter : NSObject<RCTBridgeModule>
- (void)sendEvent:(NSString *)name;
@end

BTAdapter.m

#import "BTAdapter.h"

#import "RCTBridge.h"
#import "RCTEventDispatcher.h"

@implementation BTAdapter

RCT_EXPORT_MODULE()

@synthesize bridge = _bridge;

+ (id)allocWithZone:(NSZone *) zone
{
    static BTAdapter *sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [super allocWithZone:zone];
    });
    return sharedInstance;
}


- (void)sendEvent:(NSString *)name
{
    NSLog(@"Received generic event in the bridge");
    if (self.bridge == nil) {
        NSLog(@"Bridge is nil"); // This happens normally
    } else {
        NSLog(@"Bridge is NOT nil"); // This happens with a singleton
    }
    [self.bridge.eventDispatcher sendAppEventWithName:name body:@"Event from the bridge"];
}

添加到我的Bridging-Header.h

#import "BTAdapter.h"

我在Swift中称它为:

let adapter: BTAdapter = BTAdapter()
adapter.sendEvent("TestEvent")

这是一件坏事吗?我在一个类似的主题上跟踪了一个相当过时的React Native GitHub问题,但是围绕这个解决方案并没有很多确定性。 This seems to suggest it's not a good idea at all.

这里有什么问题?

1 个答案:

答案 0 :(得分:2)

在我删除自己的初始化代码之前,我遇到了这个问题。如果您需要配置,我建议您使用RCT_EXPORT_METHOD来打电话准备模块。