我使用下面的函数来评估javascript,但是在主线程上运行这个方法会阻塞应用程序。这个 while
循环永远不会结束。有没有其他方法可以做到这一点,或者修复这个方法?
- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script
{
__block NSString *resultString = nil;
__block BOOL finished = NO;
[self evaluateJavaScript:script completionHandler:^(id result, NSError *error) {
if (error == nil) {
if (result != nil) {
resultString = [NSString stringWithFormat:@"%@", result];
}
} else {
NSLog(@"evaluateJavaScript error : %@", error.localizedDescription);
}
finished = YES;
}];
while (!finished)
{
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:NSDate .distantPast];
}
return resultString;
}
当你调用 -[NSRunLoop runMode:beforeDate:]
,该调用将在运行循环等待输入时阻塞。
你需要创建一个NSPort,并在运行NSRunLoop之前将其添加为输入源。在异步evaluateJavaScript回调中,创建一个NSPortMessage,然后将其发送到NSPort。这将导致 -[NSRunLoop runMode:beforeDate:]
调用返回,触发你的完成检查。
不过,也许你可以回贴一下你要解决的问题是什么?最好避免这样的同步进程间通信,以保持你的应用程序的主线程尽可能的空闲。这很可能是WKWebView没有公开evaluateJavaScript的同步变体的原因。