簡體   English   中英

Swift:如何在同步方法中包裝異步方法?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM