我在JavaScript应用程序JSContext
的帮助下,通过JavaScript在iOS应用程序中运行应用程序逻辑。最近,需要使用某种Promise库,不幸的是,WebKit原生的Promise实现在无头JSContext
中不起作用。但是,所有Promise / A +库都需要一些机制来将回调分派给消息队列,而在浏览器中,具有最佳性能的选项现在是setImmediate
。
但是,无头setImmediate
(例如JSContext
或postMessage
)中无法使用MessageChannel
或浏览器中通常用于填充它的任何机制。
出于这个原因,我为setTimeout
和setImmediate
注入了以下实现:
@implementation JSContext (TimingPolyfills)
- (void)injectTimerPolyfills {
self[@"setTimeout"] = ^(JSValue *function, JSValue *timeout) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)([timeout toInt32] * NSEC_PER_MSEC)), dispatch_get_main_queue(), ^{
[function callWithArguments:@[]];
});
};
self[@"setImmediate"] = ^(JSValue *function) {
[function callWithArguments:@[]];
};
}
@end
这似乎工作正常。但是,调度到本机和返回JS的性能影响是巨大的。以下微基准测试可能没有超级意义,但它显示了进行本地往返的成本:
// takes around 10.5s for 1.000.000 iterations
[context evaluateScript:@"setImmediate(function() {});"];
// takes around 6.5s for 1.000.000 iterations
[context evaluateScript:@"(function() {})();"];
所以最大的问题是:是否有任何选项可以获得setImmediate
- 无头JSContext
中的功能,其占用空间小于调度到本机并返回JS?