我在弄清楚为什么这段代码运行缓慢时遇到了一些麻烦。我正在做的是从雅虎财经获得4家公司的JSON数据。从JSON数据我只是提取4家公司的名称。然而,由于我NSLog这4家公司的名称,它需要将近2秒钟才能完成!他们在代码中的东西是我做错了吗?如何让代码运行得更快?
for (int i=0; i<4; i++) {
//download JSON data
NSData* data = [NSData dataWithContentsOfURL:
[NSURL URLWithString:@"http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22AAPL%22,%22GOOG%22,%22GE%22,%22MCD%22)%0A%09%09&env=http%3A%2F%2Fdatatables.org%2Falltables.env&format=json"]];
//parse out the json data
NSError* error;
NSDictionary* json = [NSJSONSerialization
JSONObjectWithData:data //1
options:kNilOptions
error:&error];
//Get the relavent data from JSON
NSString* companyName = [[[[[json objectForKey:@"query"] objectForKey:@"results"] objectForKey:@"quote"] objectAtIndex:i] objectForKey:@"Name"] ;
NSLog(@"company name is %@", companyName);
}
答案 0 :(得分:2)
正如理查德所说,不要下载文件4次。作为第一次迭代尝试:
//download JSON data
NSData* data = [NSData dataWithContentsOfURL:
[NSURL URLWithString:@"http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22AAPL%22,%22GOOG%22,%22GE%22,%22MCD%22)%0A%09%09&env=http%3A%2F%2Fdatatables.org%2Falltables.env&format=json"]];
//parse out the json data
NSError* error;
NSDictionary* json = [NSJSONSerialization
JSONObjectWithData:data //1
options:kNilOptions
error:&error];
for (int i=0; i<4; i++) {
//Get the relavent data from JSON
NSString* companyName = [[[[[json objectForKey:@"query"] objectForKey:@"results"] objectForKey:@"quote"] objectAtIndex:i] objectForKey:@"Name"] ;
NSLog(@"company name is %@", companyName);
}
答案 1 :(得分:1)
NSLog
会降低应用程序的速度,数据请求方法+dataWithContentsOfURL:
是同步的,这意味着您的应用程序位于那里并等待响应在返回循环的其余部分之前返回。
使用asynchronous request获取网络数据,将JSON解析代码放入处理响应的委托方法中。这将使应用程序看起来运行得更快,只要它们进入后立即处理结果。