【问题标题】:Tracking download progress of a response to a ASIFormDataRequest跟踪对 ASIFormDataRequest 的响应的下载进度
【发布时间】:2010-10-05 21:23:31
【问题描述】:

我正在向 Web 服务器发送带有 POST 数据的请求。 Web 服务器在发生错误时返回 JSON 响应,如果没有错误,则返回文件数据本身。

我想跟踪文件数据响应的进度。我的代码基于来自 ASIHttpRequest Tutorial的示例代码

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];

[request setPostValue:someValue forKey:@"someKey"];
[request setPostValue:someOtherValue forKey:@"someOtherKey"];
[request setShowAccurateProgress:YES];
[request setDownloadProgressDelegate:aProgressView];

request.delegate = self;
[request startSynchronous];

在完成响应之前什么都不会发生,在这种情况下,进度条会完全填满。

我尝试了同步和异步请求。

我猜下载进度委托不起作用,因为我本身并没有下载文件,而只是接收到对请求的 HTTP 响应,对吧?在这种情况下,监控进展的正确方法是什么?

提前谢谢...

【问题讨论】:

    标签: iphone cocoa cocoa-touch asihttprequest


    【解决方案1】:

    你是在主线程中运行这段代码吗?

    如果是这样,进度不更新的原因是使用同步请求会阻塞主线程,从而阻止 UI 更新发生。

    最好的解决方法是使用异步请求 - 你提到你已经尝试过了,发生了什么?

    提示:

    打印 http 响应并检查是否有 Content-Length。如果不是,或者它是 0,那就是问题所在。

    NSLog(@"Response headers %@",[request responseHeaders]);
    

    【讨论】:

    • 这也是我的第一个想法,但是异步和同步请求都会导致类似的行为。即使在异步请求期间,在收到整个响应之前,也不会调用 updateProgress 方法。
    • 另一种可能性是,如果服务器没有返回 Content-Length: 标头 - 那么 ASIHTTPRequest 无法知道下载的总大小,因此无法报告完成百分比。 apache 中还有一个已知错误,它可以报告压缩响应的错误大小,因此 ASIHTTPRequest 在这种情况下禁用进度报告。如果您将响应中的 HTTP 响应的完整标头添加到您的问题中,则可能可以进行诊断。
    • 非常感谢约瑟夫。 Content-Length 确实没有设置。服务器人员修复了它,它现在按预期工作!
    • 内容长度是我遇到的问题。 Http响应不包括它。感谢 JosephH 的提示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多