2016-02-24 5 views
1

У меня есть протокол JSExport с именем ChannelExport по методу - (void)sendRequest:(NSDictionary *)request withCallback:(JSValue *)callback;. При вызове этого метода из кода Javascript работает хорошо, как это:Как передать функцию JS как свойство объекта в iOS

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]; 
}