Как передать функцию JS как свойство объекта в iOS
У меня есть JSExport
протокол имени ChannelExport
с методом - (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) { ... }
});
В этом случае, когда я пытаюсь вызвать callback
функция в ObjC, приложение вылетает. Видимо callback
объект не является JSValue
, но вместо NSDictionary
(чтобы быть более точным, __NSDictionaryM
). Я предполагал, что функция JS правильно упакована как 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];
}