在Objective-C中暂停/恢复下载

时间:2011-03-02 16:59:19

标签: iphone objective-c http-headers download

好的。希望这将是我关于我在Objective-C中编写的下载管理器的最后一篇文章。除了暂停/恢复功能外,一切似乎都运行良好。我的问题是,当下载尝试从停止的地方继续下载时,它会将收到的数据附加到文件中,但它似乎仍在尝试下载整个文件。这会导致文件大于原始文件。这是我用于下载文件的代码。我做错了吗?

-(void)start:(unsigned int)fromByte {
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:self.url] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:DEFAULT_TIMEOUT];

    // Define the bytes we wish to download.
    NSString *range = [NSString stringWithFormat:@"bytes=%i-", fromByte];
    [request setValue:range forHTTPHeaderField:@"Range"];

    // Data should immediately start downloading after the connection is created.
    self.urlConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:TRUE];

    if (!self.urlConnection) {
        #warning Handle error.
    }
}

3 个答案:

答案 0 :(得分:5)

我看到你在请求中指定了Range标头。要检查的第一件事是服务器是否真正遵守Range请求,方法是检查NSHTTPURLResponse中响应对象(应该是connection:didReceiveResponse:)中的标头,以获得正确的Content-Range。

答案 1 :(得分:1)

我终于弄明白了。事实证明,我所拥有的'getFilesizeInBytes'方法是从文件的属性中获取NSFileSize对象,但我直接将其转换为int。这导致数量比应有的数量大约20倍。我能够使用[@"" intValue]解决这个问题。修复后,服务器能够以正确的字节开头给我剩下的文件。似乎在我的问题出现之前,服务器并非尊重我的请求,但是无法尊重我的请求,因为我要求的数据远远超出文件的最后一个字节。

答案 2 :(得分:0)

NSURLConnection中不支持暂停/恢复。您可以通过停止请求来模拟它,然后在恢复时使用Range标题发出对其余内容的请求。这需要来自HTTP服务器的一些支持,并且不能保证。

看起来服务器上缺乏支持就是你所面临的。

但是,大多数下载管理器都会在套接字上实现自己的HTTP堆栈。