2017-07-14 21 views
0

私はReact NativeでgRPCを使用しようとしています。 まず、Objective-CでgRPCモジュールをセットアップできました。 次に、そのgRPCモジュール用のネイティブモジュールを作成しました。React Native(RCT_REMAP_METHOD):パラメータと戻り値を持つメソッドをエクスポートするにはどうすればいいですか?

gRPCモジュールは非常に簡単です。

rpc CheckEmail(EmailCheckRequest) returns (EmailCheckResponse) {} 

message EmailCheckRequest { 
    string email = 1; 
} 

message EmailCheckResponse { 
    common.RetCode ret = 1; 
} 

ご覧のとおり、1つの入力パラメータ(電子メールアドレス)があり、「リターンコード」が返されます。

https://facebook.github.io/react-native/docs/native-modules-ios.htmlでネイティブモジュールを作成する方法を確認しました。戻り値の付いたモジュールまたはモジュールを作成する方法を示していますが、両方でモジュールを作成する方法は説明していません。

ここに例があります。 (約束と実際に、)パラメータ戻り値と

RCT_EXPORT_METHOD(addEvent:(NSString *)name) 
{ 
    RCTLogInfo(@"Pretending to create an event %@", name); 
} 

モジュールと

モジュールは

RCT_REMAP_METHOD(findEvents, 
       findEventsWithResolver:(RCTPromiseResolveBlock)resolve 
       rejecter:(RCTPromiseRejectBlock)reject) 
{ 
    NSArray *events = ... 
    if (events) { 
    resolve(events); 
} else { 
    NSError *error = ... 
    reject(@"no_events", @"There were no events", error); 
    } 
} 

はとにかく、これに基づいて、私はこのように自分のコードを作りました。

RCT_REMAP_METHOD(checkEmail: (NSString *)email, resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) 
{ 
    /* ... */ 
} 

反応しやすいサイドのJavaScriptコードは、このようなものです。 var NetworkService = NativeModules.NetworkService; var ret = NetworkService.checkEmail('[email protected] ');アプリを実行している間は、コンパイルエラーがなかった

は、しかし、XcodeはRCT_REMAP_METHOD線 「com.facebook.React.JavaScript(11)で、このランタイムエラーを返す:EXC_BAD_ACCESS(=コード= 1、アドレス0x88)

それはRCT_REMAP_METHODマクロに問題があるように見えますが、Objective-Cの詳細を知らないとマルコを使用する方法がわからない。

をモジュールをエクスポートするRCT_REMAP_METHODマクロを使用する方法を知っている人がある場合にはパラメータと戻り値を使用するか、コードに問題がある場合はお知らせください。

追加の発見 私はRCT_REMAP_METHODの定義に従っていましたが、代わりにRCT_EXPORT_METHODを使用するのが良いと思われます。EXPORTはREMAPの再定義であり、EXPORTでの約束の例がありますが、これを行う。

* ## Promises 
* 
* Bridge modules can also define methods that are exported to JavaScript as 
* methods that return a Promise, and are compatible with JS async functions. 
* 
* Declare the last two parameters of your native method to be a resolver block 
* and a rejecter block. The resolver block must precede the rejecter block. 
* 
* For example: 
* 
* RCT_EXPORT_METHOD(doSomethingAsync:(NSString *)aString 
*       resolver:(RCTPromiseResolveBlock)resolve 
*       rejecter:(RCTPromiseRejectBlock)reject 
* { ... } 
* 
* Calling `NativeModules.ModuleName.doSomethingAsync(aString)` from 
* JavaScript will return a promise that is resolved or rejected when your 
* native method implementation calls the respective block. 
* 
*/ 

答えて

0

追加の発見部分で触れたように、パラメータと戻り値を持つモジュールをRCT_EXPORT_METHODでエクスポートできました。

RCT_EXPORT_METHOD(checkEmail: (NSString *)email 
    resolver:(RCTPromiseResolveBlock)resolve 
    rejecter:(RCTPromiseRejectBlock)reject) 
{ 
    /* ... */ 
} 

このようにして、私は "checkEmail"をエクスポートすることができました。

Javascript:NativeModules.ModuleName.checkEmail(email);

私はObjective-Cの背景知識がないので、このように動作しても、コードに問題がある場合はお知らせください。=)

0

RCT_EXPORT_METHODは、remapのjs関数からネイティブ関数です。これは、複数のネイティブメソッドが最初のコロンまで同じで、衝突するJavaScript名を持つ場合に便利です。

RCT_REMAP_METHOD(js_name, method)の定義のように、js_nameは、jsコードから呼び出される関数を意味します。methodは、ネイティブ関数名を意味します。 JSコードから

// Bridge.m 

RCT_EXPORT_MODULE(Bridge) 

RCT_REMAP_METHOD(findEvents, 
       type:(NSString *)type 
       params:(NSDictionary *)params 
       findEventsWithResolver:(RCTPromiseResolveBlock)resolve 
       rejecter:(RCTPromiseRejectBlock)reject) 
{ ... } 

そこで、このような関数を呼び出します:

あなたは、パラメータ(またはそれ以上)でメソッドをエクスポートしたいのであれば、あなたがそのように行うことができます

const Bridge = NativeModules.Bridge; 

class App extends Component { 
    asnyc _buttonPress() { 
    try { 
     let result = await Bridge.findEvents("type", {"key": "value"}); 
     // handle the result 
    } catch(e) { 
     // handle the error 
    } 
    } 
} 

RCTPromiseRejectBlockが最後の2つのパラメータであることを確認してください。

関連する問題