首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >WKWebView:尝试从主线程同步查询javascript

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

Stack Overflow用户
提问于 2015-02-07 22:26:47
回答 1查看 4.2K关注 0票数 11

有任何方法可以从主线程同步查询javascript吗?

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

代码语言:javascript
复制
func evaluateJavaScript(_ javaScriptString: String, completionHandler completionHandler: ((AnyObject!, NSError!) -> Void)?)

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

代码语言:javascript
复制
// 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)

在本例中,由于总是在主线程上调用...however,所以代码死锁,因为completionHandler块永远不会执行(主线程在最后一行被dispatch_semaphore_wait暂停)。

有什么建议吗?

编辑

我宁愿不阻塞主线程来执行该代码。但是,如果不将API从同步更改为异步,则无法将其与主线程分离,这会在堆栈上产生多米诺效应(例如,从let ua = computeUserAgent()computeUserAgent() {(ua: String)->Void in /*Use ua value here */})。因此,我需要在两种方法中进行选择,这两种方法都有缺点,我更愿意选择一种不会破坏我的内部API的方法,特别是对于像查找用户代理这样琐碎的任务。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-08 03:57:56

如果你必须这么做..。

正如在对this answer的评论中所建议的那样,您可以在信号量周围运行一个紧凑的循环,如下所示。

代码语言:javascript
复制
while (dispatch_semaphore_wait(sema, DISPATCH_TIME_NOW)) { 
    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode 
                             beforeDate:[NSDate dateWithTimeIntervalSinceNow:10]];
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28388197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档