0

URLのコンテンツをダウンロードするこのコードがあります。URL の内容は単に別の URL へのリンクであるため、ダウンロードに時間がかかることはまったくありません。

NSString *additional = @"test string"; 
NSString *urlString = [NSString stringWithFormat:@"http://tts-api.com/tts.mp3?&return_url=1&q=%@", additional];
    NSLog(@"string: %@", urlString);
    NSString *modifiedURLString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSLog(@"modified url string: %@", modifiedURLString);
    NSURL *url = [NSURL URLWithString:modifiedURLString];
    NSLog(@"url: %@", url);
    NSData *data = [NSData dataWithContentsOfURL:url];
    NSLog(@"data length: %i", data.length);

データが返されるまでには常に約 20 秒かかり、出力されるデータの長さは常に短くなります (そうあるべきです)。ログは次のとおりです。

string: http://tts-api.com/tts.mp3?&return_url=1&q=test string
modified url string: http://tts-api.com/tts.mp3?&return_url=1&q=test%20string
url: http://tts-api.com/tts.mp3?&return_url=1&q=test%20string
data length: 69

興味深いことに、追加の文字列を「test」などの 1 つの単語にすると、ほんの一瞬で処理が完了します。

複数の単語を使用すると速度が低下する理由はありますか?

4

1 に答える 1

7

これは、応答を生成するのに非常に長い時間がかかる Web サービスです。応答を高速化するためにコードでできることは何もありません。dataWithContentsOfURL:ただし、これにかかる時間を制御できないため、リモートサーバーからデータをロードするために使用するべきではありません。メイン スレッドでこれを行うと、リクエストに時間がかかりすぎると、アプリはウォッチドッグ タイマーによって強制終了されます。

URL 読み込みシステムを使用して、リクエストを非同期で実行します。これが単純な変形です:

[NSURLConnection sendAsynchronousRequest: [NSURLRequest requestWithURL: url] 
                                   queue: [NSOperationQueue mainQueue] 
                       completionHandler: ^( NSURLResponse *response, NSData *data, NSError *error ) { 
    // Process response in this log
}];
于 2013-05-30T21:38:52.817 に答える