gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 22:59:37 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com