好的。希望这将是我关于我在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.
}
}
答案 0 :(得分:5)
我看到你在请求中指定了Range标头。要检查的第一件事是服务器是否真正遵守Range请求,方法是检查NSHTTPURLResponse
中响应对象(应该是connection:didReceiveResponse:
)中的标头,以获得正确的Content-Range。
答案 1 :(得分:1)
我终于弄明白了。事实证明,我所拥有的'getFilesizeInBytes'
方法是从文件的属性中获取NSFileSize
对象,但我直接将其转换为int
。这导致数量比应有的数量大约20倍。我能够使用[@"" intValue]
解决这个问题。修复后,服务器能够以正确的字节开头给我剩下的文件。似乎在我的问题出现之前,服务器并非尊重我的请求,但是无法尊重我的请求,因为我要求的数据远远超出文件的最后一个字节。
答案 2 :(得分:0)
NSURLConnection中不支持暂停/恢复。您可以通过停止请求来模拟它,然后在恢复时使用Range
标题发出对其余内容的请求。这需要来自HTTP服务器的一些支持,并且不能保证。
看起来服务器上缺乏支持就是你所面临的。
但是,大多数下载管理器都会在套接字上实现自己的HTTP堆栈。