今天做JS和OC交互,功能是实现点击web页面上的一个按钮,推出本地原生界面,很简单的一个小需求,但还是遇到了两个小坑。
坑1:方法名没对称上
因为不管是JS还是Java,在一个方法里可以一下子传递多个参数,但是OC方法里,如果要传递多个参数,则中间必须有个单词间隔一下。类似:
-(void)configName:(NSString *)name Age:(int)age;
后台一开始给的方法是只有一个参数的goBssGold(参数),但是需求需要有两个,所以我自愿在后面加了一个loanId,
我的方法名就变成了:
- (void)goBssGold:(NSString *)str1 loanId:(NSString *)str2;
但实际上,java和JS那边的方法名还是goBssGold(参数1,参数2),结果可想而知,肯定调用不了咯。
最后改成如下图就可以了。
- (void)goBss:(NSString *)str1 Gold:(NSString *)str2;
嗯,如果还要继续加参数,只能将单词继续拆开了。
补充一下,如果JS调用的方法名是goBssgold(a,b),我们这边定义的是goBss:(int)a gold:(int)b,但是仍然无法调用,系统不认。这可能因为要跟JS交互的关系,带参数的首字母必须大写
坑2:[self showHUD]
第二个坑是在数据请求的时候产生崩溃,崩溃原因是:
invalid mode 'kCFRunLoopCommonModes' provided to CFRunLoopRunSpecific - break on _CFRunLoopError_RunCalledWithInvalidMode to debug. This message will only appear once per execution.
小编表示一下子没看懂,只知道似乎是线程出了问题了。打断点看一下崩在哪里吧
,如下:
现在知道了,线程出问题了,showHUD要求在主线程执行,但是我们从web页跳转过来,不一定在主线程。知道问题就好办了,将GCD将需要在主线程执行的代码放到主线程就可以了。
dispatch_async(dispatch_get_main_queue(), ^{
[self showHUD];
});