我有一个API可以获取要下载的文件URL。我正在使用NSURLConnection
下载该文件。文件大小可能有点大,因为它是MP4。
初始化NSMutableURLRequest
并将HttpHeaderField
添加到我想要恢复的字节索引中。 (我这样做是因为互联网连接可能会丢失)。
使用NSURLConnection
初始化NSMutableURLRequest
。
使用connection:didReceiveData:
接收数据段并将其附加到全局NSMutableData
对象。
由于互联网问题,可能会生成错误消息,并使用connection:didFailWithError:
处理。在此处理程序中,我setText
下载状态标签,其中包含消息“无互联网连接,或者速度很慢”。睡1秒钟然后再回到第1步。
- (void)viewDidLoad
{
[super viewDidLoad];
[self resumeDownload];
}
- (void)resumeDownload
{
NSURL *url = [NSURL URLWithString:video->videoUrl];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
if (receivedData==nil)
{
receivedData = [[NSMutableData alloc] init];
}
else
{
NSString *range = [NSString stringWithFormat:@"bytes=%i-", receivedData.length];
[request setValue:range forHTTPHeaderField:@"Range"];
}
downloadConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
}
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
NSLog(@"%@", [response description]);
}
- (void) connection:(NSURLConnection*)connection didFailWithError:(NSError*) error
{
NSLog(@"Download Fail : %d", [error code]);
[status setText:@"No internet conectivity or it is very slow."];
sleep(1);
[self resumeDownload];
}
- (void) connectionDidFinishLoading:(NSURLConnection*)connection
{
// save the file
}
- (void) connection: (NSURLConnection*) connection didReceiveData: (NSData*) data
{
if(connection == downloadConnection)
{
[receivedData appendData:data];
[status setText:[NSString stringWithFormat:@"Downloading: %d Bytes.", receivedData.length]];
}
}
注意:当互联网重新连接时,下载将自动恢复。
这是解决问题的正确方法吗?
答案 0 :(得分:1)
总而言之 - 你走在正确的道路上
你应该检查你得到的错误类型 - 如果没有网络,再没有必要再尝试,你应该使用可达性测试找出何时再试一次。
您还应该检查响应类型 - 即使这对您来说是失败的,4xx / 5xx也不会返回连接失败,例如 - 502错误意味着您应该稍后尝试,即使连接成功完成。
我会避免使用睡眠 - 你正在阻止主线程
使用performSelector:withObject:afterDelay或使用NSTimer
哦,一秒钟对我来说太短了。