如何在Obj-C中使用回调定义Javascript函数?

时间:2013-10-21 13:32:13

标签: javascript ios objective-c javascriptcore

我正在使用JavaScriptCore来评估我的应用中的一些简单脚本。我正在创建一个全局对象并在其上定义一些属性,如下所示:

JSContext *context = [[JSContext alloc] init];
JSValue *globalObject = [context globalObject];

[globalObject setValue:fields forProperty:@"fields"];
...

然后脚本可以访问fields中的值,依此类推。我希望脚本能够使用一个名为lookup的函数,并且我已经有了这个函数的Objective-C实现。

如何向全局对象添加属性,该对象是一个回调我的Objective-C方法的函数?我看到有一个名为JSObjectMakeFunctionWithCallback的函数,但它使用像JSObjectRef这样的低级C结构并且采用C函数,而不是Objective-C块,所以我无法使用实施中的self

1 个答案:

答案 0 :(得分:1)

您可以将Objective-C块传递给JSContext,然后它将作为一个函数运行。这样,您的脚本可以回调到您的iOS代码:

context[@"factorial"] = ^(int x) {
    int factorial = 1;
    for (; x > 1; x--) {
        factorial *= x;
    }
    return factorial;
};
[context evaluateScript:@"var fiveFactorial = factorial(5);"];
JSValue *fiveFactorial = context[@"fiveFactorial"];
NSLog(@"5! = %@", fiveFactorial);

来源:Bignerdranch