JavaScriptCore:尝试将JS函数作为块传递给Objective-C,获取'TypeError'异常

Jor*_*hen 3 javascript webkit objective-c objective-c-blocks javascriptcore

我一直在玩新的iOS 7/Mavericks JavascriptCore桥,尝试将Objective-C上的JS函数作为块.

JavascriptCore头文件声明只要支持每个参数,这是可能的,但尝试这样做:

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

context[@"Log"] = ^(NSString *message){NSLog(@"%@", message);};

context[@"BlockTest"] = ^(void (^blockTest)(NSString* blockString)){
    NSLog(@"Calling Block Test");
    blockTest(@"STRINGGGGG");
};

[context evaluateScript:@"BlockTest( function(dataString){Log('JS '+dataString);} )"];
Run Code Online (Sandbox Code Playgroud)

引发以下JS异常:

TypeError: '[object NSBlock]' is not a function (evaluating 'BlockTest( function(dataString){Log('JS '+dataString);} )')
Run Code Online (Sandbox Code Playgroud)

关于我的测试代码有什么问题的任何想法?

Mik*_*ike 7

我知道你已经接受了这个被删除的答案(并且这是一个老问题),但你可以将一个JS函数作为一个块传递给iOS7/Mavericks引入的JavaScriptCore框架中的Objective-C - 你的代码只需要稍微改变你声明和调用块的方式:

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

context[@"Log"] = ^(NSString *message){NSLog(@"%@", message);};

context[@"BlockTest"] = ^(JSValue *blockTest){
    NSLog(@"Calling Block Test");
    [blockTest callWithArguments:@[@"STRINGGGGG"]];
};

[context evaluateScript:@"BlockTest( function(dataString){Log('JS '+dataString);} )"];
Run Code Online (Sandbox Code Playgroud)