ios - 评估 WKWebview 的 javascript 方法会出现问题
问题描述
我正在使用以下函数来评估 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 的同步变体的原因。
推荐阅读
- angular - Angularjs条件要求不起作用
- python - 如何遍历特定字段的所有键值对的json对象?
- python - 如何将列表中已有的单词分解为单个字符?
- python - 如何将此信息放在列中?
- swift - 使用 @fetchRequest(entity:) 处理 SwiftUI macOS 应用程序崩溃
- pygame - 为什么 pygame.display.update() 如果紧随其后的是输入?
- python - 更新从 Python 中的 json Api 导入的数据
- angular - 如何从单个服务器调用中填充 Angular 状态数据组件?
- python - python中的十六进制变量
- c - 如何将多个值添加到结构中