运行 带有回调的 JS 时 JavascriptCore 挂起

JavascriptCore hangs when running a JS with callback

我正在尝试 运行 使用来自 Objective-C 的 JavascriptCore 的 JS 函数。这是 JS 代码:

var FeedParser = require('feedparser');
var run = function(data, options){
  var feedparser = new FeedParser(options);
  feedparser.on('readable', function() {
    if(callback){
      callback(this.read());
    }
  });
  feedparser.end(data);
};

module.exports = {
  run: run
};

这里是调用 JS 的 Objective-C 代码:

NSString *path = [[NSBundle mainBundle] pathForResource:@"rss" ofType:@"js"];
NSStringEncoding encoding;
NSError *error = nil;
NSString *js = [NSString stringWithContentsOfFile:path
                                         usedEncoding:&encoding
                                                error:&error];

JSContext *context = [[JSContext alloc] init];
[context setExceptionHandler:^(JSContext *context, JSValue *value) {
        NSLog(@"%@", value);
}];
context[@"callback"] = ^(JSValue *val){
    @try{
        if([val isString]){
            NSLog(@"%@", [val toString]);
        } else if([val toDictionary][@"0"]){
            NSLog(@"%@", [val toArray]);
        } else {
            NSLog(@"%@", [val toDictionary]);
        }
    }
    @catch(NSException *e){
    }
};
[context evaluateScript:js];

JSValue *parse = context[@"rss"][@"run"];
[parse callWithArguments:@[data, o]];

注:

  1. 需要说明的是,这种方法适用于立即 return 结果的所有其他 JS 函数。我正在使用 browserify 将它们全部打包到一个 JS 中。我只是注意到通过回调异步 return 的函数存在问题。 (注意我在上下文中添加了 callback 函数。
  2. 当我在 XCode 上 运行 它挂起(不仅是应用程序而且 XCode 编辑器本身,并且它永远不会恢复,直到我从 [=38 中终止进程=] 监视器).
  3. 然而,出于某种原因,当我从笔记本电脑上拔下 iPhone 时,它 return 就是结果。 (此时XCode在我杀掉它之前还处于悬崖状态)
  4. 与 XCode 分离后,应用程序 运行 正常。它只是在 运行ning 从 XCode 调用 运行.
  5. 时挂起

可能您正在尝试通过 toDictionary 调用将某些 JavaScript 值转换为 NSDictionary。该方法尝试递归转换值,因此经常导致挂起。我怀疑在这种情况下,任何带有循环引用的 JS 值都会导致无限递归。尝试直接使用 JSValue。