使用NSURLConnection下载文件?

时间:2012-11-07 13:42:11

标签: objective-c ios download resume-download

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

代码步骤:

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

  2. 使用NSURLConnection初始化NSMutableURLRequest

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

  4. 由于互联网问题,可能会生成错误消息,并使用connection:didFailWithError:处理。在此处理程序中,我setText下载状态标签,其中包含消息“无互联网连接,或者速度很慢”。睡1秒钟然后再回到第1步。

  5. 代码:

    - (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]];
        }
    }
    

    屏幕截图:

    enter image description here enter image description here

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

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

1 个答案:

答案 0 :(得分:1)

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