我有一个名为JSExport
的{{1}}协议,其方法为ChannelExport
。从Javascript代码调用此方法可以正常工作,如下所示:
- (void)sendRequest:(NSDictionary *)request withCallback:(JSValue *)callback;
在ObjC中,我可以访问channel.sendRequestWithCallback({'foo': 'bar'}, function(response) { ... });
字典中的值,也可以调用request
函数。
现在我想将接口更改为callback
,将JS函数作为- (void)sendRequest:(NSDictionary *)request
字典的一部分传递,如下所示:
request
在这种情况下,当我尝试在ObjC中调用channel.sendRequestWithCallback({
'foo': 'bar'
'callback': function(response) { ... }
});
函数时,应用程序崩溃了。显然,callback
对象不是callback
,而是JSValue
(更确切地说,是NSDictionary
)。我假设JS函数正确地包装为__NSDictionaryM
,其方式与将其作为简单参数传递时的方式相同。
有没有提示为什么会这样,以及如何解决这个问题?
答案 0 :(得分: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];
}