JavascriptCore没有正确调用带参数的函数

时间:2015-03-30 13:18:15

标签: ios javascriptcore

我已经制作了一个iOS应用程序来安装&运行javascript脚本并执行此操作,我使用的是JavascriptCore。我的一些脚本是周期性的,这意味着它们每隔X秒启动一次。

伪代码示例:

every('X seconds', function(event) {
   save(event.timestamp);
});

到目前为止,一切都很好,直到我意识到几分钟后(约3分钟)我调用的函数开始忽略我的论点。我得到了#34;未定义"在我的save方法中! 它已经工作了一段时间然后 ......

Objective-c代码:

[_executionContext evaluateScript:[NSString stringWithFormat:@"var myFunc = %@", _script]];
[_executionContext[@"myFunc"] callWithArguments:@[event.data]];

解释

  1. 我评估function(event) { ... }script)字符串并将其保存在myFunc对象中。
  2. 我用我的event.data调用此函数来公开时间戳。简单!
  3. 请注意,即使event.timestamp返回未定义,我的event.data对象也不是!我在Objective-c代码中发现没有错。我认为callWithArguments方法中发生了一些事情,或者我错过了一些东西......

    数据界面:

    @protocol DataExports<JSExport>
    @property (nonatomic) long timestamp;
    @end
    
    @interface APSData : MTLModel<DataExports>
    @end
    

    我在设备和模拟器上遇到同样的问题。

    我做错了吗?

    此致

1 个答案:

答案 0 :(得分:0)

好的,我找到了解决方案!

每次我的事件发生时,我都不会在我的函数上使用evaluationScript,而是在地图中保存一次,然后用它来调用我的函数。所以基本上:

[_executionContext evaluateScript:[NSString stringWithFormat:@"var %@ = %@", _functionHash, _script]];
_functionMap[_functionHash] = [_executionContext evaluateScript:_functionHash];

如果需要,我打电话:

[_functionMap[_functionHash] callWithArguments:@[event.data]];

对我而言,我之前所做的并没有什么不同,但似乎效果更好......

编辑:嗯......它确实不起作用。现在它在10分钟后失败了..