iOS开发日常小记

今天做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.

小编表示一下子没看懂,只知道似乎是线程出了问题了。打断点看一下崩在哪里吧
,如下:

崩溃位置.png

现在知道了,线程出问题了,showHUD要求在主线程执行,但是我们从web页跳转过来,不一定在主线程。知道问题就好办了,将GCD将需要在主线程执行的代码放到主线程就可以了。

    dispatch_async(dispatch_get_main_queue(), ^{
        [self showHUD];
    });

你可能感兴趣的:(iOS开发日常小记)