我正在尝试在我的 WKWebView
中同步加载 Javascript。根据我的研究,看起来 evaluateJavaScript
方法是异步的,这会导致错误,因为页面会在 JS 覆盖很多行为之前加载(由于异步,它只在一部分时间工作)性质)。
我已经试过了,但它似乎不起作用:
extension WKWebView {
func evaluateJavaScriptSynchronously(script: String, completion: () -> Void) {
let semaphore = dispatch_semaphore_create(1)
evaluateJavaScript(script) { (result, error) in
if error == nil {
if result != nil {
print("SUCCESS")
completion()
}
} else {
print("ERROR!!!")
print(error)
print(result)
completion()
}
dispatch_semaphore_signal(semaphore)
}
let timeout = dispatch_time_t(10000)
dispatch_semaphore_wait(semaphore, timeout)
}
}
我知道它不起作用,因为页面有时仍会加载,就好像 JS 不存在一样。我可以做类似的事情来同步流程吗?
最佳答案
您可以定义一个 WKNavigationDelegate
以在加载到 WKWebView
的页面时得到通知
class Controller: UIViewController, WKNavigationDelegate {
@IBOutlet var webView: WKWebView!
override func viewDidLoad() {
self.view = webView
webView.navigationDelegate = self
}
func webView(webView: WKWebView, didFinishNavigation navigation: WKNavigation!) {
print("page loaded")
// <--- call your method from here
}
}
您现在可以从 webView(wevView:didFinishNavigation:)
关于ios - Swift:如何在同步方法中包装异步方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38684660/