【问题标题】:Update iPhone UIProgressView during NSURLConnection download在 NSURLConnection 下载期间更新 iPhone UIProgressView
【发布时间】:2010-03-26 03:47:43
【问题描述】:

我正在使用此代码:

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 个像素,在屏幕底部留下一个白条。

也许这是一个单独的问题,也许不是。

【问题讨论】:

    标签: iphone cocoa-touch download nsurlconnection uiprogressview


    【解决方案1】:
    self.oDPVC.oProgress.progress = [oNum floatValue];
    

    设置进度属性不会 更新控件。

    self.oDPVC 的值是多少(是nil)?

    self.oDPVC.oProgress 的值是多少(是nil)?

    其他几点。

    第一:

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

    您的oDPVC @property 是如何定义的?如果它使用retain,则此行可能(将)稍后导致内存泄漏(它将是双重retain-ed)。您应该改用这种模式:

    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 对象。您可能还需要考虑将分母加一以避免被零除:

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

    【讨论】:

    • 感谢您关于双重保留的评论。我可以在这个话题上了解更多。 self.oDPVC 不为零,因为我成功地将其子视图添加到窗口。 self.oDPVC.oProgress 不为零,因为我可以按如下方式检查它的宽度: CGRect newFrame = self.oDPVC.oProgress.frame; NSLog(@"进度宽度:%f", newFrame.size.width);最后,除以零不是问题,因为我的分母是预期的总字节数,而且永远不会为零。
    • 我应该补充一点,当我测试 oProgress 的宽度时,它是 160,而不是 IB 中设置的 280。关于进度条的另一条线索:有些人报告说进度条保持为零,并在他们的任务结束时跳到 100。我的永远不会从零改变。
    • 所有问题都已解决。 default.png 下面有空白,因为在 IB 中它被调整大小以便为状态栏腾出空间,而我不知道。进度条的大小错误,因为不知何故,我的 viewDidLoad 中有一些代码正在初始化另一个 UIProgressView 或重新初始化现有的。删除那行代码会使进度条达到预期的大小,而且它现在会更新,我不需要用线程来玩弄。道德:你总是在最后一个地方找到你要找的东西!
    猜你喜欢
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    相关资源
    最近更新 更多