我刚用this answer来设置Yahoo Finance的数据请求。如果您查看帖子,您会看到它返回数据字典(在本例中为出价)和键(符号)。为了测试它,我使用了这段代码,但它继续崩溃:
NSArray *tickerArray = [[NSArray alloc] initWithObjects:@"AAPL", nil];
NSDictionary *quotes = [self fetchQuotesFor:tickerArray];
NSLog(@"%@",[quotes valueForKey:@"AAPL"]);
你能指出我做错了什么吗?我需要得到一个包含我要求的符号数据的字符串。
请注意:我的代码使用的是此帖子所基于的代码,即this。
答案 0 :(得分:1)
您喜欢的代码对从API返回的JSON数据的形状做出了错误的假设,并且您得到了标准的KVC错误。 reason: '[<__NSCFString 0x7685930> valueForUndefinedKey:]: this class is not key value coding-compliant for the key BidRealtime.'
通过一些调试我得到了它...
根据您的输入数组并稍微修改链接的函数,您需要像这样访问引号:
#define QUOTE_QUERY_PREFIX @"http://query.yahooapis.com/v1/public/yql?q=select%20symbol%2C%20BidRealtime%20from%20yahoo.finance.quotes%20where%20symbol%20in%20("
#define QUOTE_QUERY_SUFFIX @")&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback="
+ (NSDictionary *)fetchQuotesFor:(NSArray *)tickers {
NSMutableDictionary *quotes;
if (tickers && [tickers count] > 0) {
NSMutableString *query = [[NSMutableString alloc] init];
[query appendString:QUOTE_QUERY_PREFIX];
for (int i = 0; i < [tickers count]; i++) {
NSString *ticker = [tickers objectAtIndex:i];
[query appendFormat:@"%%22%@%%22", ticker];
if (i != [tickers count] - 1) [query appendString:@"%2C"];
}
[query appendString:QUOTE_QUERY_SUFFIX];
NSData *jsonData = [[NSString stringWithContentsOfURL:[NSURL URLWithString:query] encoding:NSUTF8StringEncoding error:nil] dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *results = jsonData ? [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:nil] : nil;
NSDictionary *quoteEntry = [results valueForKeyPath:@"query.results.quote"];
return quoteEntry;
}
return quotes;
}
您会注意到我在此处发布的代码与您链接的函数之间的差异也是quoteEntry
的最终解析。我通过一些断点计算了它正在做的事情,特别是在所有异常上,这些断点将我引向了确切的行。
答案 1 :(得分:0)
您所要做的就是初始化NSMutableDictionary!
NSMutableDictionary * quotes = [[NSMutableDictionary alloc] init];
顺便说一句,上面的那个人完全没有使用引号dict。直接返回quoteEntry。跳过一步。 :)