0

我在弄清楚为什么这段代码运行缓慢时遇到了一些麻烦。我在下面做的是从 yahoo Finance 获取 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);
}
4

2 回答 2

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);
}
于 2012-07-24T22:45:05.937 回答
1

NSLog会减慢应用程序的速度,并且数据请求方法+dataWithContentsOfURL:是同步的,这意味着您的应用程序会坐在那里等待响应返回,然后再进行其余的循环。

使用异步请求获取网络数据,将您的 JSON 解析代码放入处理响应的委托方法中。这将使应用程序看起来运行得更快,通过在结果进入后立即处理。

于 2012-07-24T22:46:27.830 回答