2010-03-26 35 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