1

我有一个 API 可以让我下载要下载的文件 URL。我正在使用NSURLConnection下载文件。文件大小可能有点大,因为它是 MP4。

代码步骤:

  1. 使用我要从中恢复下载的字节索引进行初始化NSMutableURLRequest并添加到其中。HttpHeaderField(我这样做是因为互联网连接可能会丢失)。

  2. NSURLConnection用初始化NSMutableURLRequest

  3. 用于connection:didReceiveData:接收数据段并将其附加到全局NSMutableData对象。

  4. 由于 Internet 问题,可能会生成错误消息,并使用connection:didFailWithError:. 在这个处理程序中,我setText下载状态标签带有消息“没有互联网连接,或者很慢”。睡眠 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]];
    }
}

屏幕截图:

在此处输入图像描述 在此处输入图像描述

注意:当互联网重新连接时,下载将自动恢复。

这是解决问题的正确方法吗?

4

1 回答 1

1

总而言之 - 你在正确的道路上。
你应该检查你得到的错误类型——如果没有网络,再试一次也没有意义,你应该使用可达性测试来找出什么时候再试一次。
您还应该检查响应类型 - 4xx / 5xx 不会返回连接失败,即使这对您来说是失败的,例如 - 502 错误意味着您应该稍后再试,即使连接成功完成。
我会避免使用 sleep - 你阻塞了主线程。
使用 performSelector:withObject:afterDelay 或使用 NSTimer。
哦,一秒钟对我来说似乎太短了。

于 2012-11-07T13:53:56.437 回答