Grz*_*icz 9 iphone gzip objective-c nsurlconnection
我正在写一个从网上下载东西的iPhone客户端.由于蜂窝网络不是那么快,文件可能很大,我想通过进度条改进活动微调器.
到目前为止一切顺利,我正在使用NSURLConnection并检查Content-Length标头以查看我将下载多少字节.然后,在-connection:didReceiveData:回调中,我将接收到的数据附加到我的NSMutableData对象,在那里我可以跟踪到目前为止下载内容的大小与预期的字节数.
这一切都有效,直到你有一个支持gzip压缩的服务器.使用gzip压缩的服务器将x字节作为内容的大小.但是,由于NSURLConnection在后台进行解压缩,因此传递给didReceiveData回调的数据已经扩展.因此,预期下载的字节小于实际接收的字节,以文件的压缩比例的比例.
这意味着进度条溢出,因为预期的字节数比预期的要早得多.我控制服务器时可以做的就是为gzip内容发送特殊标头,以避免NSURLConnection进行解压缩,但我无法控制网络上的所有服务器.
NSURLConnection是否有任何隐藏方法来报告传输的字节而不是扩展的字节?我是否必须编写自己的NSURLConnection来跟踪传输的字节并自行解压缩gzip数据以获得准确的进度条指示器?也许有另一种较低级别的Core Foundation API?
IIRC,你应该使用的-expectedContentLength方法NSURLResponse,在我的测试中,返回NSURLResponseUnknownLength(-1)gzip压缩的内容.
一种解决方法是通过手动设置Accept-Encoding标头来禁用发送gzip压缩内容:
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:yourURL];
[request setValue:@"" forHTTPHeaderField:@"Accept-Encoding"];
Run Code Online (Sandbox Code Playgroud)
但是,当然,这会扼杀内容.:/
(如果有一个更好的解决方案(希望不会涉及低于水平的NSURL*东西)我也很想知道它...)
使用 ASIHTTPRequest 库。这是我对几乎所有“我如何成为 iPhone 上的 Web 客户端”问题的通用答案,但在这种情况下特别有用。
检查一下:
-(void)viewDidLoad {
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:myNSURLObject];
request.delegate = self;
request.downloadProgressDelegate = self.myUIProgressViewInstance;
//it'll update that progress bar with a percentage complete automatically!
//or give it any custom class that responds to -progress!
[request startAsynchronous];
}
- (void)requestFinished:(ASIHTTPRequest *)request
{
//do whatever to process the data you just got
}
Run Code Online (Sandbox Code Playgroud)
ASIHTTP 使许多强大的网络操作变得非常简单。我是它的忠实粉丝。
http://allseeing-i.com/ASIHTTPRequest/
| 归档时间: |
|
| 查看次数: |
2296 次 |
| 最近记录: |