【问题标题】:Is it possible to query the JavaScriptCore event loop?是否可以查询 JavaScriptCore 事件循环?
【发布时间】:2016-02-04 20:44:54
【问题描述】:

如果我使用 JavaScriptCore 在我的 iOS 应用程序中运行一些 JavaScript,我的本机代码是否可以查询 JavaScript 当前是否正在处理事件,和/或是否有事件等待下一步立即处理?

场景:正在运行的 JS 正在管理一些状态,我希望我的 UI 线程偶尔查询 JS 以获取该状态,但如果 JS 先忙于处理其他事件,我不想冒险等待太久。

【问题讨论】:

    标签: ios cocoa javascriptcore


    【解决方案1】:

    我调查了一下,发现这个问题有一个令人惊讶的答案:如果你不实现它,JSCore 中没有 javascript 事件循环。

    添加更多细节,javascript 代码的执行始终与调用它的 ObjC 函数同步,并且 Javascript 中没有生成异步执行的方法:没有 setTimeout,没有 setInterval,没有 DOM 和 @987654324 @。您必须在本地实现这些功能,然后您必须决定调度策略。如果您的 JSContext 附加到 WebView 或类似的类似浏览器的上下文,则 WebView 会提供这些事件,您可能无法以您想要的方式访问它们。但是,在这种情况下,您可以使用 Zone.js 之类的东西来修补所有可能生成事件的函数并在 Javascript 中实现一些跟踪您想要的东西(这是在技术演示的视频中完成的,在链接的页)

    【讨论】:

      【解决方案2】:

      基于此处对 API 源的快速浏览: https://github.com/phoboslab/JavaScriptCore-iOS/tree/master/JavaScriptCore/API

      我在JSContextJSVirtualMachine 上没有看到任何可以获取您感兴趣的信息的功能。

      作为替代方案,您可以在每次 JS 代码开始/结束处理事件时从 JS 回调您的 ObjC 代码,然后将状态信息存储在 ObjC 端,以便您可以快速确定您是否相信 JSVM是否处理事件。

      【讨论】:

      • 谢谢,有趣的想法。这需要我在每个 JS 事件处理程序中显式调用 ObjC 回调,对吗?有没有什么简单的方法可以在一个地方在全球范围内做到这一点?
      • 我假设你知道正在运行什么代码,所以你可以挂钩让 JS VM 运行的长时间运行的命令?
      • 挂钩到任何可以创建异步代码执行的函数是 Zone js(Angular 的一部分)所做的。它在 Angular 中这样做的原因是检测可能需要重绘 UI 的属性更改。看看它,看看它是否符合您的目的,并且可以在没有完整 Angular 框架的情况下使用
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-09
      • 2014-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多