Spi*_*ike 2 javascript objective-c ios grpc react-native
我正在尝试在React Native使用gRPC.首先,我能够使用Objective-C设置我的gRPC模块.接下来,我为该gRPC模块制作了一个原生模块.
gRPC模块非常简单.
rpc CheckEmail(EmailCheckRequest) returns (EmailCheckResponse) {}
message EmailCheckRequest {
string email = 1;
}
message EmailCheckResponse {
common.RetCode ret = 1;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,有一个输入参数(电子邮件地址)并返回"返回代码".
我检查了如何在https://facebook.github.io/react-native/docs/native-modules-ios.html上创建一个本机模块,它展示了如何使用参数或带有返回值的模块创建模块,但它没有解释如何与两者合二为一.
以下是示例.
带参数的模块
RCT_EXPORT_METHOD(addEvent:(NSString *)name)
{
RCTLogInfo(@"Pretending to create an event %@", name);
}
Run Code Online (Sandbox Code Playgroud)
具有返回值的模块(实际上,带有Promise)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
无论如何,基于此,我自己制作了这样的代码.
RCT_REMAP_METHOD(checkEmail: (NSString *)email, resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
{
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
反应原生端javascript代码是这样的.var NetworkService = NativeModules.NetworkService; var ret = NetworkService.checkEmail('spike@merong.com');
没有编译错误,但在运行的应用程序,在XCode的线RCT_REMAP_METHOD返回此运行时错误"com.facebook.React.JavaScript(11):EXC_BAD_ACCESS(码= 1,地址=均为0x88)
看起来RCT_REMAP_METHOD宏有问题,但不知道Objective-C细节,也不知道如何使用marco.
如果有人知道如何使用RCT_REMAP_METHOD宏导出带有参数和返回值的模块,或者如果我的代码有问题,请告诉我.
附加查找 我跟着RCT_REMAP_METHOD的定义,似乎它是好的使用RCT_EXPORT_METHOD代替,因为出口是REMAP的重新定义,并有承诺的一个实例与出口,但不能确定它是否是这样做的正确方法.
* ## 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.
*
*/
Run Code Online (Sandbox Code Playgroud)
RCT_EXPORT_METHOD只是remap将js函数转换为本机函数.当多个本机方法在第一个冒号之前相同并且具有冲突的JavaScript名称时,这很有用.
作为define RCT_REMAP_METHOD(js_name, method),js_name表示从js代码调用的函数,method表示本机函数名称.
因此,如果要使用参数(或更多)导出方法,可以这样做:
// Bridge.m
RCT_EXPORT_MODULE(Bridge)
RCT_REMAP_METHOD(findEvents,
type:(NSString *)type
params:(NSDictionary *)params
findEventsWithResolver:(RCTPromiseResolveBlock)resolve
rejecter:(RCTPromiseRejectBlock)reject)
{ ... }
Run Code Online (Sandbox Code Playgroud)
然后从js代码中调用这样的函数:
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
}
}
}
Run Code Online (Sandbox Code Playgroud)
确保
RCTPromiseResolveBlock和RCTPromiseRejectBlock是最后两个参数.
正如我在附加查找部分提到的,我能够使用 RCT_EXPORT_METHOD 导出带有参数和返回值的模块。
RCT_EXPORT_METHOD(checkEmail: (NSString *)email
resolver:(RCTPromiseResolveBlock)resolve
rejecter:(RCTPromiseRejectBlock)reject)
{
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
通过这种方式,我能够导出“checkEmail”。
JavaScript:NativeModules.ModuleName.checkEmail(电子邮件);
我没有 Objective-C 背景知识,所以即使它以这种方式工作,如果我的代码有问题,请告诉我。=)
| 归档时间: |
|
| 查看次数: |
5453 次 |
| 最近记录: |