2016-02-24 148 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]; 
} 
相關問題