我正在使用NSURLConection及其委托方法从在线TTS api异步获取数据。这是我要加载的网址:
http://tts-api.com/tts.mp3?q=hello world
以上网址重定向并为我们提供了一个我需要下载的MP3文件。我使用以下委托方法下载mp3文件:
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
if (connection == connectionToTTSAPI) {
mp3Manager = [NSFileManager defaultManager];
localPath = [[[NSBundle mainBundle] resourcePath]stringByAppendingPathComponent:@"hello.mp3"];
mp3Handler = [NSFileHandle fileHandleForWritingAtPath:localPath];
if (!mp3Handler) {
[[NSFileManager defaultManager] createFileAtPath:localPath contents:nil attributes:nil];
mp3Handler = [NSFileHandle fileHandleForWritingAtPath:localPath];
}
@try {
[mp3Handler seekToEndOfFile];
[mp3Handler writeData:data];
}
}
}
由于我在程序中使用了多个NSURLConnection,因此我设置了一个if条件来识别响应是针对哪个连接的。但我没有得到mp3文件,所以我在委托方法中设置了一个断点,并发现与TTS API的连接永远不会得到响应。我认为这是因为重定向。当我经历其他一些问题时,我已经看到了使用以下方法,但我在NSURLConnectionDelegate
中找不到这样的函数,并且作为NSURLConnection的启动器我不知道如何使用该方法用于处理重定向。没有一个结果让我清楚地知道如何使用它。
- (NSURLRequest *)connection: (NSURLConnection *)inConnection
willSendRequest: (NSURLRequest *)inRequest
redirectResponse: (NSURLResponse *)inRedirectResponse;
答案 0 :(得分:0)
iOS的委托方法在NSURLConnectionDataDelegate
中定义,让您有机会控制重定向的处理方式(您可以取消,更改或不更改)。
在您的情况下,您希望让它请求重定向响应返回的URL,因此一个简单的实现将是:
- (NSURLRequest *)connection: (NSURLConnection *)inConnection
willSendRequest: (NSURLRequest *)inRequest
redirectResponse: (NSURLResponse *)inRedirectResponse {
return inRequest;
}
我认为这应该是默认行为,所以如果请求没有被处理,问题很可能在其他地方......