![](/img/trans.png)
[英]How to wrap an asynchronous method that takes a block and turn it synchronous in Objective-C
[英]Swift: How to wrap an async method in a synchronous method?
我正在尝试在我的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:)
调用您的方法webView(wevView:didFinishNavigation:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.