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”,它会在几分之一秒内完成。

任何想法为什么有多个单词会减慢我的速度?

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 回答