![](/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.