我为HTTP请求提供ASIHTTPRequest并将结果保存到单独的文件中。由于文件预计很大,它也应该能够恢复。
request.allowResumeForFileDownloads = YES;
request.downloadDestinationPath = destFile;
request.temporaryFileDownloadPath = tmpFile;
我使用以下选择器:
request.didFinishSelector = @selector(didFinishRequest:);
request.didFailSelector = @selector(didFailRequest:);
request.didReceiveResponseHeadersSelector = @selector(didReceiveResponse:);
现在我通过丢失连接,不同的代理等来测试不同的情况,并发现一个问题,如果收到的响应是其他类似503之类的代码,那么ASIHTTPRequest仍会将结果保存到临时文件中,这是错误,因为数据是一些随机的HTML页面有错误(如果有部分下载的文件,那么这个HTML被附加到它,这使我的数据损坏)。
所以我要做的就是检查响应代码,如果不是2XX,则取消请求而不保存任何内容。
这没有帮助:
- (void)didReceiveResponse:(ASIHTTPRequest*)request {
if (request.responseStatusCode < 200 || request.responseStatusCode >= 300) {
[request clearDelegatesAndCancel];
有什么想法吗?
答案 0 :(得分:0)
到目前为止还没有找到一个干净的解决方案,所以有一点点黑客攻击:
在方法readResponseHeaders的最后一行中的ASIHTTPRequest.m中,我们需要更改为waitUntilDone:YES(第2281行),因此代码不会继续运行和处理数据。
[self performSelectorOnMainThread:@selector(requestReceivedResponseHeaders:) withObject:[[[self responseHeaders] copy] autorelease] waitUntilDone:YES];
不幸的是,在didReceiveResponse:选择器中,我们不能简单地调用clearDelegatesAndCancel方法,因为它只会挂起线程,因为ASIHTTPRequest中存在锁定。所以我所做的只是使用了我从ASIHTTPRequest获取的一些方法:
[request setComplete:YES];
[request setDownloadComplete:YES];
[request requestFinished];
[request markAsFinished];
虽然,前两种方法不公开,Xcode显示警告,但它仍然有效。
顺便说一句,就在2天前,我看到post说ASIHTTPRequest不再受支持了:(