子线程中WKWebView调用evaluateJavaScript同步返回潜在问题
作者:互联网
子线程中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