在 Swift 中实现 RCTEventEmitter 但未设置桥接异常

Posted

技术标签:

【中文标题】在 Swift 中实现 RCTEventEmitter 但未设置桥接异常【英文标题】:Implement RCTEventEmitter in Swift but receive exception for bridge is not set 【发布时间】:2019-08-16 18:50:12 【问题描述】:

我正在尝试在 Swift 中为 React Native 实现一个事件发射器,以便我可以在我的一些本机模块中重用它。但是,当我从 ios 本地发送事件时,我收到以下错误

Bridge is not set. This is probably because you've explicitly synthesized the bridge in MyEventEmitter, even though it's inherited from RCTEventEmitter.
/// MyEventEmitter.m
#import <Foundation/Foundation.h>
#import <React/RCTBridgeModule.h>
#import <React/RCTEventEmitter.h>

@interface RCT_EXTERN_MODULE(MyEventEmitter, RCTEventEmitter)

RCT_EXTERN_METHOD(supportedEvents)

@end

在 Swift 中的实现:

import Foundation

@objc(MyEventEmitter)
class MyEventEmitter: RCTEventEmitter 

    public static let shared = MyEventEmitter()

    override func supportedEvents() -> [String]! 
        return [
            ... // my event list
        ]
    

在我的原生 swift 代码中,我初始化了发射器

private let eventEmitter: MyEventEmitter = .shared

// send event
self.eventEmitter.sendEvent(withName: "someEvent", body: nil)

我还将&lt;React/RCTBridgeModule.h&gt;&lt;React/RCTEventEmitter.h&gt; 放在我的桥接头中。

我在这里做错了什么?

【问题讨论】:

【参考方案1】:

我发现的问题是你不能自己实例化MyEventEmitterpublic static let shared = MyEventEmitter()

您应该重写init 方法并将self 分配给shared

import Foundation

@objc(MyEventEmitter)
class MyEventEmitter: RCTEventEmitter 

    public static var shared:MyEventEmitter?

    override init() 
        super.init()
        MyEventEmitter.shared = self
    

    override func supportedEvents() -> [String]! 
        return [
            ... // my event list
        ]
    

这是因为 RN 已经实例化对象本身并分配桥,而当您自己执行时,桥不会被分配。

【讨论】:

以上是关于在 Swift 中实现 RCTEventEmitter 但未设置桥接异常的主要内容,如果未能解决你的问题,请参考以下文章

swift 样本机协议在swift中实现

swift 在swift中实现整数结构

在 Swift 中实现哈希表?

swift 在Swift 3中实现APNs处理

这是如何在 swift 4 中实现的?

swift 在Swift中实现的GraphQL数据结构