我正在使用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
。
答案 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