[英]How to convert a javascript object into an NSDictionary using JavaScriptCore
[英]Calling javascript functions using javascriptcore framework returns [object Object] to JSValue
.js
文件中的代碼:
var fact = function(x){
return WeatherWebService(x);
}
Objective-C原生方法:
- (IBAction)btnOkClicked:(id)sender
{
[self.aJSEngine loadJSLibrary:@"script"];
}
- (void)loadJSLibrary:(NSString*)libraryName
{
NSString *library = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:libraryName ofType:@"js"] encoding:NSUTF8StringEncoding error:nil];
NSLog(@"[JSC] loading library %@...", libraryName);
[self runJS:library];
}
- (void)runJS:(NSString *)aJSString
{
if (!aJSString) {
NSLog(@"[JSC] JS String is empty!");
}
else{
JSContext *context = [[JSContext alloc]initWithVirtualMachine:[[JSVirtualMachine alloc]init]];
context[@"WeatherWebService"] = ^(int x){
NSDictionary *dict = [self callingWeatherFromJavascript];
return dict;
};
[context evaluateScript:aJSString];
JSValue *val = context[@"fact"];
JSValue *finalResult = [val callWithArguments:@[context[@"3"]]];
}
}
-(NSDictionary*)callingWeatherFromJavascript{
NSString *urlString = @"http://api.openweathermap.org/data/2.5/weather?q=London,uk";
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]];
__block BOOL complete = NO;
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
operation.responseSerializer = [AFJSONResponseSerializer serializer];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
// 3
self.dictionary = (NSDictionary *)responseObject;
complete=YES;
// NSDictionary *dict = [self.dictionary objectForKey:@"main"];
// if ([self.delegate respondsToSelector:@selector(returnDataFromResponse:)]) {
// [self.delegate returnDataFromResponse:dict];
// }
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
// 4
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error Retrieving Weather"
message:[error localizedDescription]
delegate:nil
cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
complete=NO;
[alertView show];
}];
// 5
[operation start];
while(complete == NO) {
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
}
return self.dictionary;
}
在上面的代碼中,方法'callingWeatherFromJavascript'
返回NSDictionary
。 當我在函數'-(void)runJS'
“ JSValue”中接收到此值時,它將返回[object Object]
。 有什么辦法可以將其轉換回NSDictionary
嗎?
我不想忘記vivek_ios,他回答了自己的問題。 我只想重寫他的回答,以便更清晰,更輕松地重復使用,因為我花了一些時間才能在評論中找到答案。
基本上,將JSValue轉換為NSDictionary只需通過JSValue.toDictionary完成。 像這樣:
JSContext *jsContext = [JSContext new];
[jsContext evaluateScript:[NSString stringWithContentsOfFile:myJavascriptFilePath encoding:NSUTF8StringEncoding error:nil]];
NSDictionary *result = [jsContext[@"myJavascriptFunction"] callWithArguments:@[optionalArgument]].toDictionary;
首先隱藏您對NSData的響應對象
NSData *responseData = [[NSData alloc]initWithContentsOfFile:(NSString*)responseObject encoding:NSUTF8StringEncoding error:nil];
然后使用JSON序列化創建NSDictionary,就像您從Web服務接收JSON對象一樣
NSDictionary *responceDictionary = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:nil];
然后,您應該能夠訪問“主”鍵並從此處獲取所有信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.