dataWithContentsOfURL需要很长时间才能返回url中的大量单词

And*_*rew 0 url objective-c nsdata ios

我有这个代码下载网址的内容.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);
Run Code Online (Sandbox Code Playgroud)

数据总是需要大约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
Run Code Online (Sandbox Code Playgroud)

有趣的是,如果我将附加字符串作为单个单词,例如"test",它可以在几分之一秒内完成.

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

Sve*_*ven 7

这是一个需要很长时间才能生成答案的Web服务,您无法在代码中执行任何操作以使其更快.但是你真的不应该使用dataWithContentsOfURL:从远程服务器加载数据,因为你无法控制这需要多长时间.如果你在主线程上执行此操作,如果请求花费的时间过长,那么看门狗定时器将会杀死你的应用程序.

使用URL加载系统并以异步方式运行请求.这是一个简单的变体:

[NSURLConnection sendAsynchronousRequest: [NSURLRequest requestWithURL: url] 
                                   queue: [NSOperationQueue mainQueue] 
                       completionHandler: ^( NSURLResponse *response, NSData *data, NSError *error ) { 
    // Process response in this log
}];
Run Code Online (Sandbox Code Playgroud)