繁体   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