2012-07-24 126 views
0

我在查找为什么此代码运行缓慢时遇到了一些问题。我在下面做的是从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

你正在做的几件事情在这里很慢:'NSURLRequest'和'NSJSONSerialization',你为什么要这样做4次,而不是缓存结果? – 2012-07-24 22:43:07

回答

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); 
} 
+0

谢谢。这很有道理,我不知道为什么我之前没有这样做。 – SNV7 2012-07-24 23:12:07

1

NSLog会减慢应用程序和数据请求方法+dataWithContentsOfURL:是同步的,这意味着你的应用程序坐在那里,等待响应之前通过将剩余回来循环。

使用asynchronous request获取网络数据,将JSON解析代码放入处理响应的委托方法中。这将使应用程序看起来运行得更快,通过处理结果,只要他们进来。

+0

这是正确的答案。尽管DrummerB的回应确实提出了一个有效的观点,即OP会多次下载相同的数据,但在后台线程中执行此类处理更为重要,因此UI不会显示无响应。 – aeu 2015-10-15 14:53:45