3

我一直在玩新的 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);} )"];

引发以下 JS 异常:

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

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

4

2 回答 2

7

我知道您已经接受了对此的支持已被删除的答案(这是一个老问题),但是您可以在 iOS7/Mavericks 引入的 JavaScriptCore 框架中将 JS 函数作为块传递给 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);} )"];
于 2014-04-14T02:37:15.443 回答
3

似乎对此的支持已被删除并且文档未更新:

http://trac.webkit.org/changeset/144489

于 2013-10-17T10:28:34.077 回答