0

このコードの実行が遅い理由を理解するのに少し苦労しています。私が以下で行っているのは、4 つの企業の yahoo ファイナンスから JSON データを取得することです。JSON データから、単純に 4 つの会社の名前を抽出しています。しかし、私は 4 つの会社の名前を NSLog するので、これを行うのにほぼ丸 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 に答える