导出(桥接)从Objective-C的方法反应本地人,有着无极返回NULL只有
问题描述:
我试图出口Objective-C的方法反应母语与希望,但是当我检查的反应本地的返回值,尽管objective-c返回正确的数据,但它始终为空。导出(桥接)从Objective-C的方法反应本地人,有着无极返回NULL只有
这里是我的Objective-C的方法。
RCT_EXPORT_METHOD(checkEmail:(NSString *)email
resolver:(RCTPromiseResolveBlock)resolve
rejecter:(RCTPromiseRejectBlock)reject)
{
@autoreleasepool {
[GRPCCall useInsecureConnectionsForHost:kHostAddress];
AccountService *client = [[AccountService alloc] initWithHost:kHostAddress];
EmailCheckRequest *request = [EmailCheckRequest message];
request.email = email;
NSLog(@"Requested Email: %@\n", request.email);
[client checkEmailWithRequest:request handler:^(EmailCheckResponse *response, NSError *error) {
NSLog(@"Email Check result: %d\n", response.ret);
if (response) {
NSLog(@"Resolved response\n");
resolve(response);
}
else {
NSLog(@"Rejected response\n");
reject(@"no_events", @"There was no event", error);
}
}];
}
}
而反原生方法的定义是这样的。
checkEmail = (email:string) => {
console.log('Network Check Email is called');
return this._network.checkEmail(email);
}
或
checkEmail = (email:string) => {
return new Promise((resolve, reject) => {
console.log('Network Check Email is called');
this._network.checkEmail(email).then((res) => {
console.log('check email result: ' + res);
resolve(res);
});
});
}
我测试了这两种情况下,但checkEmail的返回值始终是空。
async _checkEmailDuplication() {
try {
console.log('Check Email Duplication is called');
const res = await MyNetwork.checkEmail(this.state.email);
console.log('Check email return value: ' + res);
if (res === 0) {
console.log('Available Email');
return false;
}
else {
console.log('Email Duplication Check Error');
this.state.errMsg = WSStrings.errCodes[res];
return true;
}
}
catch (e) {
console.error('Check Email Call Error', e.message);
this.state.errMsg = e.message;
return true;
}
}
以下是来自Xcode的日志,当我运行上面的代码时。
2017-07-18 00:51:43.781 [info][tid:com.facebook.React.JavaScript] Check Email Duplication is called
2017-07-18 00:51:43.782 [info][tid:com.facebook.React.JavaScript] Network Check Email is called
2017-07-18 00:51:43.839 [5782:110747] Requested Email: [email protected]
2017-07-18 00:51:43.872 [5782:109339] Email Check result: 2
2017-07-18 00:51:43.872 [5782:109339] Resolved response
2017-07-18 00:51:43.873 [info][tid:com.facebook.React.JavaScript] check email result: null
2017-07-18 00:51:43.874 [info][tid:com.facebook.React.JavaScript] Check email return value: null
2017-07-18 00:51:43.874 [info][tid:com.facebook.React.JavaScript] Email Duplication Check Error
它没有得到正确的返回代码,而只是NULL,不能进入下一个步骤。
是否有在Objective-C代码或反应的本地代码任何语法错误?
我没有Objective-C的背景知识和我没有在承诺足够的经验和应对本地的桥梁,因此,如果有人能帮助我,将不胜感激。
答
最后,我找到了答案。 resolve(response)
这部分是问题所在。
响应对象不是由JavaScript端解释,所以不得不交出的NSDictionary对象这样的,而不是移交响应对象本身。
if (response) {
NSLog(@"User ID: %d Language: %@\n", response.uid, response.language);
NSDictionary *dictRes = @{
@"ret":@(response.ret),
@"uid":@(response.uid),
@"lang":response.language
};
resolve(dictRes);
}
无论如何,这是Objective-C方面的问题,而不是Javascript。
问题解决!!