react-native调用ios native方法-回调
上一篇中介绍了使用react-native调用ios native方法,在真实的使用场景中,不仅仅只是调用下Native的方法,还需要对结果进行处理,Native处理完之后返回结果再回调会JavaScript中进行操作和处理。 RCTReponseSenderBlock在JavaScript和Object-C的参数列表,有一类参数叫做
typedef void (^RCTResponseSenderBlock)(NSArray *response);
他的参数是一个 @interface RNIOSAlert : NSObject<RCTBridgeModule,UIAlertViewDelegate> @end 定义一个变量用来保存参数: @implementation RNIOSAlert{ RCTResponseSenderBlock _alertCallback; } @end 在 -(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ if (buttonIndex==0) { _alertCallback(@[@"cancel",]); }else{ _alertCallback(@[[NSNull null],@1]); } } 最后定义带有回调参数的Native方法: RCT_EXPORT_METHOD(showAlertAndCallback:(RCTResponseSenderBlock)callback){ _alertCallback=callback; UIAlertView * alertView=[[UIAlertView alloc] initWithTitle:@"react-native" message:@"是否继续?" delegate:self cancelButtonTitle:@"关闭" otherButtonTitles:@"继续",nil]; [alertView show]; } 最在JavaScript中调用Native方法,并处理回调: _alertCallback() { RNIOSAlert.showAlertAndCallback(function (err,datas) { if (err) { console.warn('err','已取消'); } else { console.warn('data','请继续'); } }); } 每次关闭 Promises
typedef void (^RCTPromiseResolveBlock)(id result); 以 typedef void (^RCTPromiseRejectBlock)(NSString *code,NSString *message,NSError *error);
@implementation RNIOSAlert{ RCTPromiseResolveBlock _resolveBlock; RCTPromiseRejectBlock _rejectBlock; } 在定义提供给JavaScript调用的Native函数: RCT_REMAP_METHOD(alertUserPromise,resolver:(RCTPromiseResolveBlock)resolver rejecter:(RCTPromiseRejectBlock)reject){ _resolveBlock=resolver; _rejectBlock=reject; UIAlertView * alertView=[[UIAlertView alloc] initWithTitle:@"react-native" message:@"使用Promise?" delegate:self cancelButtonTitle:@"关闭" otherButtonTitles:@"继续",nil]; [alertView show]; } 这里使用 -(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ if (buttonIndex==0) { NSError * err=[NSError errorWithDomain:@"test" code:0 userInfo:nil]; _rejectBlock(@"0",@"cancel",err); }else{ _resolveBlock(@[@1]); } } JavaScript中调用该方法: _alertUsePromise() { RNIOSAlert.alertUserPromise().then((datas)=> { console.warn('data',datas); }).catch((err)=> { console.warn('err',err); }); } 这里的then处理的是 async _alertPromise() { try { var datas = await RNIOSAlert.alertUserPromise(); console.warn('data',datas); } catch (e) { console.warn('err',e); } }
代码地址:https://github.com/jjz/react-... (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |