2016-06-28 64 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) 
    } 
}