2012-07-24 122 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

相關問題