gpt4 book ai didi

ios - WKWebView:尝试从主线程同步查询javascript

转载 作者:可可西里 更新时间:2023-11-01 03:18:36 32 4
gpt4 key购买 nike

有没有办法从主线程同步查询javascript?

使用带有回调参数的异步函数从 native 代码查询 Javascript 以处理响应:

func evaluateJavaScript(_ javaScriptString: String, completionHandler completionHandler: ((AnyObject!, NSError!) -> Void)?)

通常可以通过暂停线程并使用信号量控制执行来将异步行为转变为同步行为:

// Executing in the main thread
let sema = dispatch_semaphore_create(0)
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) {
// Background thread
self.evaluateJavaScript("navigator.userAgent", completionHandler: { (value:AnyObject!, error: NSError!) -> Void in
if let ua = value as? String {
userAgent = ua
} else {
ERROR("ERROR There was an error retrieving the default user agent, using hardcoded value \(error)")
}
dispatch_semaphore_signal(sema)
})
}
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER)

...但是在这种情况下,因为 completionHandler 总是 在主线程上调用,代码死锁,因为 completionHandler block 永远不会执行(主线程被最后一行的 dispatch_semaphore_wait 暂停)

有什么建议吗?

编辑

我宁愿不阻塞主线程来执行该代码。但是,如果不将我的 API 从同步更改为异步,我就无法与主线程分离,在堆栈中一直具有多米诺骨牌效应(例如,从 let ua = computeUserAgent()computeUserAgent () {(ua: String)->Void in/*Use ua value here */>)。所以我需要在两种都有缺点的方法之间做出选择,我宁愿选择不会弄乱我的内部 API 的方法,尤其是对于像查找用户代理这样微不足道的任务。

最佳答案

如果您必须这样做...

正如对 this answer 的评论中所建议的那样你可以像这样围绕你的信号量等待运行一个紧密的循环。

while (dispatch_semaphore_wait(sema, DISPATCH_TIME_NOW)) { 
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
beforeDate:[NSDate dateWithTimeIntervalSinceNow:10]];
}

关于ios - WKWebView:尝试从主线程同步查询javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28388197/

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