Как передать функцию 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 подпись для достижения вашей цели. Если вы определяете аргумент как NSDictionaryJavaScriptCore будет рекурсивно преобразовывать все объекты в этом словаре в соответствующие объекты 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];
}
Другие вопросы по тегам