我正在编写一款从网络下载内容的iPhone客户端,由于移动网络不太快,而且文件可能很大,所以我希望改进活动指示器,使用进度条来显示下载进度。
到目前为止,我使用NSURLConnection,并检查Content-Length头来查看我将要下载多少字节。然后,在-connection:didReceiveData:回调函数中,我将接收到的数据附加到我的NSMutableData对象中,因此我可以追踪已下载的内容大小与预期字节数之间的差距。
这一切都很好,直到你遇到支持gzip压缩的服务器。使用gzip压缩的服务器将广告x字节作为内容的大小。但是,由于NSURLConnection在后台执行解压缩操作,传递给didReceiveData回调函数的数据已经展开。因此,预期的下载字节数比实际接收的字节数小,比例为文件的压缩比。
这意味着进度条会溢出,因为预期的字节数比预期的早得多。当我控制服务器时,我可以为gzip内容发送特殊的头以避免NSURLConnection进行的解压缩,但我无法控制Web上的所有服务器。
是否有任何隐藏的方法使NSURLConnection报告传输字节而不是展开的字节?我是否需要编写自己的NSURLConnection以跟踪传输字节并自己解压缩gzip数据以获取准确的进度条指示器?也许有更低级别的Core Foundation API可供选择?
到目前为止,我使用NSURLConnection,并检查Content-Length头来查看我将要下载多少字节。然后,在-connection:didReceiveData:回调函数中,我将接收到的数据附加到我的NSMutableData对象中,因此我可以追踪已下载的内容大小与预期字节数之间的差距。
这一切都很好,直到你遇到支持gzip压缩的服务器。使用gzip压缩的服务器将广告x字节作为内容的大小。但是,由于NSURLConnection在后台执行解压缩操作,传递给didReceiveData回调函数的数据已经展开。因此,预期的下载字节数比实际接收的字节数小,比例为文件的压缩比。
这意味着进度条会溢出,因为预期的字节数比预期的早得多。当我控制服务器时,我可以为gzip内容发送特殊的头以避免NSURLConnection进行的解压缩,但我无法控制Web上的所有服务器。
是否有任何隐藏的方法使NSURLConnection报告传输字节而不是展开的字节?我是否需要编写自己的NSURLConnection以跟踪传输字节并自己解压缩gzip数据以获取准确的进度条指示器?也许有更低级别的Core Foundation API可供选择?