在NSURLConnection下载期间更新iPhone UIProgressView

时间:2010-03-26 03:47:44

标签: iphone cocoa-touch download nsurlconnection uiprogressview

我正在使用此代码:

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。设置progress属性不会更新控件。

根据我在网上看到的内容,很多人都希望这样做,但却没有一个完整,可靠的样本。此外,还有很多相互矛盾的建议。有些人认为你不需要一个单独的线程。有人说你需要一个后台线程来进行进度更新。有人说不,在后台做其他事情并更新主线程的进度。

我已经尝试了所有建议,但没有一个适合我。

还有一件事,也许这是一个线索。我在applicationDidFinishLaunching期间使用此代码加载子视图:

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

在XIB文件中(我在Interface Builder和文本编辑器中都检查过),进度条宽度为280像素。但是当视图打开时,它已经以某种方式调整到可能宽度的一半。此外,视图的背景图像是default.png。它不会显示在默认图像的顶部,而是向上移动大约10个像素,在屏幕底部留下一个白色条。

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

1 个答案:

答案 0 :(得分:3)

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

设置progress属性不会   更新控件。

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;