2016-06-28 63 views
2

在我创建了一个快速的模块,它开始在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) 
    } 
} 

叫我也创建了一个私有实现

#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()解包为零,并且无法播送该事件。任何想法将不胜感激。

回答

1

这Github问题导致我的解决方案:https://github.com/facebook/react-native/issues/3454。原来这只发生在重新加载。需要执行RCTInvalidating,然后清除invalidate中的任何悬挂引用。这允许ARC正确地清理您的本地模块并重新实例化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) 
    } 
}