4

我目前正在我的网站上使用对我的 API(我设置)的异步调用。我将 ASIHTTPRequest 的 setDownloadProgressDelegate 与 UIProgressView 一起使用。但是我不知道如何调用选择器 (updateProgress),它将 CGFloat 的“进度”设置为 progressView 的进度。我尝试了以下方法,但两个进度都为零。请你能告诉我如何让这个工作吗?

(in some method)

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:[url stringByAppendingFormat:@"confidential"]]];
    [request setDownloadProgressDelegate:progressView];
    [NSTimer scheduledTimerWithTimeInterval:1.0f/60.0f target:self selector:@selector(updateProgress:) userInfo:nil repeats:YES];
    [request setCompletionBlock:^{~100 lines of code}];
    [request setFailedBlock:^{~2 lines of code :) }];
    [request startAsynchronous];

- (void) updateProgress:(NSTimer *)timer {
    if (progressView.progress < 1.0) {
        currentProgress = progressView.progress;
        NSLog(@"currProg: %f --- progressViewProg: %f", currentProgress, progressView.progress);
    }
    else {
        [timer invalidate];
    }
    return;
}
4

3 回答 3

7

对于仍然找到此答案的人:请注意 ASI 已被高度弃用,您应该改用 NSURLSession 或 ASIHTTPRequest。

实现您想要的一种方法是将 设置downloadProgressDelegate为您自己的类并实现setProgress:. 在此实现中,更新您的进度变量,然后调用[progressView setProgress:];

或者在代码中,设置请求的下载进度委托:

[request setDownloadProgressDelegate:self];

然后将该方法添加到您的类中:

- (void)setProgress:(float)progress
{
    currentProgress = progress;
    [progressView setProgress:progress];
}
于 2011-06-13T08:20:25.770 回答
4

尝试添加到您的请求中:

[request setShowAccurateProgress:YES];

它不会帮助你打电话updateProgressASIHTTPRequest会改变进度指示器本身。

于 2011-06-12T17:45:27.023 回答
0

顺便说一句: 下载内容时,NS*Connection 似乎比 ASI* 快很多

无论如何,此页面上的示例意味着您不需要手动将下载对象中的值“复制”到进度视图对象。

事实上,您的基于计时器的代码正在从应该已经显示进度的进度视图中获取进度。如果我正确理解 ASIHTTP*,则此代码中根本不需要计时器。

于 2011-06-12T16:15:52.220 回答