ios - Swift:如何在同步方法中包装异步方法?

标签 ios swift

我正在尝试在我的 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/

相关文章:

iphone - 在单个设备上跨应用共享应用内购买

swift - 如何在 Swift 中将度数转换为风向

ios - 在具有字典作为“值”的字典中追加和更新

ios - 如何在 Swift 或 Objective C 中使用 PKCS8 RSA DER 私钥

swift - 如何在 Swift 中删除字符串中的重复字符

ios - 将我的项目文件夹移动到另一个位置,现在 xcworkspace 无法与我的主项目一起打开

objective-c - 如何使基于NSString的切换语句更加有效和可扩展?

ios - 添加do时,try catch Google Analytic tracker got error

ios - 沿屏幕边缘的边框

ios - 如何循环结构中的项目?