使用回调运行JS时,JavascriptCore挂起

时间:2016-06-02 18:29:46

标签: objective-c xcode javascriptcore

我正在尝试使用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调用的运行中运行时挂起。

1 个答案:

答案 0 :(得分:0)

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