在 NSURLConnection 下载期间更新 iPhone UIProgressView

3
我正在使用以下代码:

NSURLConnection *oConnection=[[NSURLConnection alloc] initWithRequest:oRequest delegate:self];

为了下载一个文件,我想要更新加载的子视图上的进度条。为此,我使用以下代码:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [oReceivedData appendData:data];
 float n = oReceivedData.length;
 float d = self.iTotalSize;
 NSNumber *oNum = [NSNumber numberWithFloat:n/d];
 self.oDPVC.oProgress.progress = [oNum floatValue];
}

子视图是oDPVC,其上的进度条是oProgress。设置进度属性不会更新控件。
从我在网上阅读的内容来看,很多人都想做到这一点,但没有完整可靠的示例。此外,有很多矛盾的建议。有些人认为你不需要单独的线程。有些人说你需要一个后台线程来更新进度。有些人说不,要在后台做其他事情,并在主线程上更新进度。
我尝试了所有的建议,但都不适用于我。
还有一件事,也许这是一个线索。我使用这段代码在applicationDidFinishLaunching期间加载子视图:
self.oDPVC = [[DownloadProgressViewController alloc] initWithNibName:@"DownloadProgressViewController" bundle:nil];
[window addSubview:self.oDPVC.view];

在XIB文件中(我已经在Interface Builder和文本编辑器中检查过),进度条的宽度为280像素。但是当视图打开时,它已被调整到大约一半的宽度。此外,视图的背景图像是default.png。它没有出现在默认图像的正上方,而是向上推了大约10个像素,留下了屏幕底部的白色条。也许这是一个单独的问题,也可能不是。
1个回答

3
self.oDPVC.oProgress.progress = [oNum floatValue];

Setting the progress property does not update the control.

self.oDPVC的值是什么(它是否为nil)?

self.oDPVC.oProgress的值是什么(它是否为nil)?

还有几点需要注意。

首先:

self.oDPVC = [[DownloadProgressViewController alloc] initWithNibName:@"DownloadProgressViewController"bundle:nil];

你的 oDPVC @property 是如何定义的?如果使用了 retain,那么这一行代码可能会导致内存泄漏(它将被双重 retain)。你应该使用以下模式:

DownloadProgressViewController* dpvc = [[DownloadProgressViewController alloc] initWithNibName:@"DownloadProgressViewController" bundle:nil];
self.oDPVC = dpvc;
[dpvc release];

第二点:

float n = oReceivedData.length;
float d = self.iTotalSize;
NSNumber *oNum = [NSNumber numberWithFloat:n/d];
self.oDPVC.oProgress.progress = [oNum floatValue];

progress属性本身就是一个浮点数,您不需要使用NSNumber对象。您还可以考虑在分母上加1以避免除零错误:

float n = oReceivedData.length;
float d = self.iTotalSize;
float percentCompleted = n/(d + 1.0f);
self.oDPVC.oProgress.progress = percentCompleted;

我很感激你提到了双重保留的问题。我需要更多关于这个主题的知识。self.oDPVC不是nil,因为我成功地将其子视图添加到了窗口中。self.oDPVC.oProgress不是nil,因为我能够检查它的宽度,如下所示:CGRect newFrame = self.oDPVC.oProgress.frame; NSLog(@"Progress width: %f", newFrame.size.width);最后,除以零不是问题,因为我的分母是预期的总字节数,而那永远不会是零。 - Scott Pendleton
我应该补充一点,当我测试oProgress的宽度时,它是160,而不是在IB中设置的280。关于进度条的另一个线索:有些人报告说进度条停留在零,并在任务结束时跳到100。我的从未从零改变过。 - Scott Pendleton
所有问题都已解决。default.png下方有白色空间,因为在IB中它被调整大小以腾出状态栏的空间,而我不知道这一点。进度条的大小不正确,因为某种原因,在我的viewDidLoad中有一些代码正在初始化另一个UIProgressView或重新初始化现有的UIProgressView。删除那行代码会导致进度条具有预期的大小,而且现在它也更新了,我不需要去操作线程。寓意:你总是在最后一个地方找到你要找的东西! - Scott Pendleton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接