2010-03-26 30 views
3

我使用这个代码:NSURLConnection的过程中更新iPhone 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文件(我在两个界面生成器和在文本编辑器已审查)进度条宽280个像素。但是当视图打开时,它已经调整到了一半的宽度。另外,该视图的背景图像是default.png。它不是直接出现在默认图像上,而是大约10个像素,在屏幕底部留下一个白色条。

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

回答

3
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; 
+0

我很感谢您对双保留的评论。我可以站在这个主题上了解更多。 self.oDPVC不是零,因为我成功地将其子视图添加到窗口。 self.oDPVC.oProgress不是零,因为我能够检查其宽度如下: CGRect newFrame = self.oDPVC.oProgress.frame; NSLog(@“Progress width:%f”,newFrame.size.width); 最后,除以零不是问题,因为我的分母是预期的总字节数,并且永远不会为零。 – 2010-03-26 12:26:05

+0

我应该补充一点,当我测试oProgress的宽度时,它是160,而不是它在IB中设置的280。关于进度条的更多线索:有些人报告说,进度条保持为零,并在任何任务结束时跳至100。我的永远不会从零变为零。 – 2010-03-26 12:29:54

+0

解决所有问题。 default.png在它下面有空格,因为在IB中它被调整为为状态栏留出空间,我不知道它。进度条的大小错误,因为不知何故,我在viewDidLoad中有一些代码正在启动另一个UIProgressView或重新启动现有的代码。删除那行代码会导致进度条成为预期的大小,现在加上它的更新,我不需要与线程混在一起。道德:你总是在最后看到的地方找到你想要的东西! – 2010-03-27 03:37:51