标签:代码 dispatch JS 线程 evaluateJavaScript WKWebView
子线程中WKWebView调用evaluateJavaScript同步返回潜在问题
业务背景
UIWebView执行JS是同步返回,WKWebView执行JS是异步返回。
这里通过死循环阻塞线程,以达到WKWebView执行JS同步返回的效果。
当调用该代码片段的业务代码是在网络请求回调或者扫描二维码回调中时,就需要从子线程切换主线程。我遇到的情况就是在扫描二维码界面,需要切换主线程。
出现问题
但是当外部业务代码使用dispatch_async和dispatch_get_main_queue切换主线程执行时,就会出现evaluateJavaScript阻塞无法调用completionHandler的情况。
根本原因
暂时未弄明白。
解决方案
使用performSelectorOnMainThread替代dispatch_async和dispatch_get_main_queue切换主线程执行。
示例代码
WKWebView *sampleWebView;
-(void)errorDemo {
dispatch_async(dispatch_get_main_queue(), ^{
sampleWebView = [[WKWebView alloc] initWithFrame:CGRectZero];
__block BOOL finished = NO;
[sampleWebView evaluateJavaScript:@"" completionHandler:^(id result, NSError *error) {
finished = YES; // 该行代码未执行
}];
while (!finished) {
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
}
});
}
标签:代码,dispatch,JS,线程,evaluateJavaScript,WKWebView 来源: https://blog.csdn.net/jhq1990/article/details/113921088
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。