2012-03-07 93 views
1

我想从服务器下载一个大文件(> 500MB)到我的应用程序。我使用NSURLConnection,如果网络非常好,那就很好。但有时我试图下载500MB文件,但如果网络不是很好,只能下载200MB或100MB文件。这意味着当任务没有完成时,我得到了connectionDidFinishLoading方法。有人说设置超时秒来避免这种情况,但我设置超时30秒,它不工作。我应该设置60s或更多?有人有更好的主意,请帮助我。NSURLConnection(下载大于500M的大文件)

+0

因此,在下载所有数据之前,您已经获得了'connectionDidFinishLoading'?这听起来不对。如果没有下载所有的数据,我希望得到一个错误。 – mattjgalloway 2012-03-07 09:58:12

+0

这确实听起来不对,你可以发布一些测试代码吗?你的网络意味着什么不太好? – fbernardo 2012-03-07 10:41:51

+0

如果他们解决了您的问题,您应该接受答案。 – MrTJ 2012-03-14 09:22:03

回答

0

in connectionDidFinishLoading方法每次检查要下载的数据的长度和下载的数据。

数据

长度要下载此[response expectedContentLength];didReceiveResponse方法

+0

你不能指望预期的内容长度。对于服务器来说,它是可选的。 – fbernardo 2012-03-07 10:38:56

0

你应该下载这样的大文件中的部分涨幅。在HTTP请求的标题中指定Content-Range字段,并且一次只询问文件的一小部分。当你获得所有部分时,你可以将文件组装在一起。

您可以使用NSMutableURLRequest setValue:@"0-1023/*" forHTTPHeaderField:@"Content-Range"];来设置HTTP标头,该示例仅下载文件的第一个千字节。请参见http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html中的内容范围

+0

另外,并非所有服务器都支持Content-Range。我记得例如用于拒绝非付费用户的部分下载,因为使用Content-Range可以继续下载。使用这种类型的服务器,您可以全部下载,也可以不下载。 – fbernardo 2012-03-07 10:40:55

+0

@fbernardo是对的,你必须检查你的服务器是否支持这个。我以某种方式假设你可以控制服务器。如果它不支持,除了希望你的文件将作为一个整体到达,没有什么可做的。 – MrTJ 2012-03-07 10:42:56

+0

你是对的,它看起来好像他控制着服务器,我只是建议构建可在多种情况下工作的可移植代码会更好...... – fbernardo 2012-03-07 10:47:44