【问题标题】:JavascriptCore hangs when running a JS with callbackJavascriptCore 在运行带有回调的 JS 时挂起
【发布时间】:2016-06-02 18:29:46
【问题描述】:

我正在尝试使用来自 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. 需要明确的是,这种方法适用于所有其他立即返回结果的 JS 函数。我正在使用 browserify 将它们全部打包到一个 JS 中。我只是注意到通过回调异步返回的函数存在问题。 (请注意,我正在将 callback 函数添加到上下文中。
  2. 当我在 XCode 上运行它时,它会挂起(不仅是应用程序,还有 XCode 编辑器本身,并且在我从 Activity Monitor 中终止进程之前它永远不会恢复)。
  3. 但是由于某种原因,当我从笔记本电脑上拔下 iPhone 时,它​​会立即返回结果。 (此时 XCode 仍处于不确定状态,直到我将其杀死)
  4. 从 XCode 分离后,应用程序运行良好。它只是在从 XCode 调用的 run 运行时挂起。

【问题讨论】:

    标签: objective-c xcode javascriptcore


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多