【问题标题】:How to pass a JS function as object property to iOS如何将 JS 函数作为对象属性传递给 iOS
【发布时间】:2016-02-24 15:51:18
【问题描述】:

我有一个名为ChannelExportJSExport 协议,其方法为- (void)sendRequest:(NSDictionary *)request withCallback:(JSValue *)callback;。从 Javascript 代码中调用此方法可以正常工作,如下所示:

channel.sendRequestWithCallback({'foo': 'bar'}, function(response) { ... });

在 ObjC 中,我可以访问 request 字典中的值,也可以调用 callback 函数。

现在我想将接口更改为- (void)sendRequest:(NSDictionary *)request,将JS函数作为request字典的一部分传递,如下所示:

channel.sendRequestWithCallback({
  'foo': 'bar'
  'callback': function(response) { ... }
});

在这种情况下,当我尝试在 ObjC 中调用 callback 函数时,应用程序崩溃了。显然callback 对象不是JSValue,而是NSDictionary(更准确地说是__NSDictionaryM)。我假设 JS 函数被正确地包装为 JSValue,就像将它作为简单参数传递时一样。

任何提示为什么会发生这种情况,以及如何解决这个问题?

【问题讨论】:

    标签: ios javascriptcore jsvalue


    【解决方案1】:

    您不能使用- (void)sendRequest:(NSDictionary *)request 签名来实现您的目标。如果您将参数定义为NSDictionary,JavaScriptCore 将递归地将此字典中的所有对象转换为相应的 Objective-C 对象。请改用- (void)sendRequest:(JSValue *)requestValue

    - (void)sendRequest:(JSValue *)requestValue {
        JSValue *fooJSValue = [requestValue valueForProperty:@"foo"];
        NSString *bar = [fooJSValue isUndefined] ? nil : fooValue.toString;
        // use bar
    
        JSValue *callback = [requestValue valueForProperty:@"callback"];
        [callback callWithArguments:myArguments];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-19
      • 2010-11-17
      • 2015-11-23
      • 2017-06-21
      • 2021-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多