gpt4 book ai didi

objective-c - React native bridge 在 swift 模块中有时为 nil

转载 作者:可可西里 更新时间:2023-11-01 01:35:37 26 4
gpt4 key购买 nike

我创建了一个 swift 模块,当从 swift 调用连接方法时,它开始监听 GCDAsyncUdpSocket

@objc(MyModule)
class MyModule: NSObject, GCDAsyncUdpSocketDelegate {
var bridge: RCTBridge!
var socket: GCDAsyncUdpSocket!

func methodQueue() -> dispatch_queue_t {
return dispatch_queue_create("com.mycompany.greatapp", DISPATCH_QUEUE_SERIAL)
}

@objc func connect(resolver resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) {
socket = GCDAsyncUdpSocket(delegate: self, delegateQueue: methodQueue())

//...start listening, etc
}

@objc func udpSocket(sock: GCDAsyncUdpSocket!, didReceiveData data: NSData!, fromAddress address: NSData!, withFilterContext filterContext: AnyObject!) {
bridge.eventDispatcher().sendAppEventWithName("got_msg", body: nil)
}
}

我还创建了一个私有(private)实现

#import <Foundation/Foundation.h>
#import "RCTBridgeModule.h"

@interface RCT_EXTERN_MODULE(MyModule, NSObject)

RCT_EXTERN_METHOD(connect resolver:(RCTPromiseResolveBlock *)resolve
rejecter:(RCTPromiseRejectBlock *)reject)

@end

但是有时 bridge.eventDispatcher() 解包为 nil 并且无法广播事件。如有任何想法,我们将不胜感激。

最佳答案

这个 Github 问题让我找到了解决方案:https://github.com/facebook/react-native/issues/3454 .原来这只发生在重新加载时。需要实现 RCTInvalidating,然后清除 invalidate 中的任何悬空引用。这允许 ARC 正确清理您的 native 模块并重新实例化 RCTBridge

@objc(MyModule)
class MyModule: NSObject, GCDAsyncUdpSocketDelegate, RCTInvalidating {
var bridge: RCTBridge!
var socket: GCDAsyncUdpSocket!

func invalidate() {
self.socket = nil
}

func methodQueue() -> dispatch_queue_t {
return dispatch_queue_create("com.mycompany.greatapp", DISPATCH_QUEUE_SERIAL)
}

@objc func connect(resolver resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) {
socket = GCDAsyncUdpSocket(delegate: self, delegateQueue: methodQueue())

//...start listening, etc
}

@objc func udpSocket(sock: GCDAsyncUdpSocket!, didReceiveData data: NSData!, fromAddress address: NSData!, withFilterContext filterContext: AnyObject!) {
bridge.eventDispatcher().sendAppEventWithName("got_msg", body: nil)
}
}

关于objective-c - React native bridge 在 swift 模块中有时为 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38076412/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com