2009-10-11 139 views
2

使用核心數據時,在線程間不斷共享數據的首選方法是什麼?我正在下載一個大文件,並想在UIProgressBar中顯示下載進度。實際下載發生在由NSOperation創建的後臺線程中。核心數據,文件下載和線程安全

將下載信息(本地路徑,總字節數,接收到的字節數)建模爲核心數據管理對象,實際文件存儲在Documents /目錄中。我想到的一個解決方案是在後臺線程中創建一個單獨的託管對象上下文,並將其傳遞給objectID,並使用objectWithID:方法將其拉出。每當後臺線程進行保存時,主線程都會收到通知,主內容將合併這些更改,並隨後更新表視圖。

此方法有效,但保存不能太頻繁或UI凍結。因此,在接收到每個X KB的數據後,UI將被更新,其中X必須至少爲500 KB才能使UI有所響應。在收到下載進度數據到主線程時是否有更好的方法?

編輯:會使用KVO有任何幫助嗎?如果是的話,你知道關於這個主題的任何好的教程嗎?

回答

4

我知道你已經建立了自己的系統,但我使用ASIHTTPRequest進行我的所有網絡操作。它非常強大,並具有許多好東西,如文件恢復,直接保存到磁盤,上傳進度監控,下載進度監控以及廚房水槽。如果您不使用它,您可以查看源代碼,看看它們是如何實現的,因爲當我在此框架中使用進度報告時,UI永遠不會凍結。

+0

首先要做的是,能夠開心點! ASIHTTPRequest看起來非常好,我將它整合到我的代碼中。它提供了比我的小小的下載框架更多的功能,它是開源的:) – Anurag 2009-10-11 22:04:26

0

雖然我要爲我的項目使用ASIHTTPRequest,但爲了完整性我還是要提出解決問題的辦法。這是顯而易見的,但是每隔幾秒鐘就會頻繁地保存核心數據上下文是一個可怕的錯誤。

相反,我在下載操作中添加了一個進度委託,它在主線程上獲取更新通知。

NSNumber bytesDownloaded = [NSNumber numberWithLongLong:[data length]]; 
[downloadDelegate performSelectorOnMainThread:@selector(updateProgress:) withObject:bytesDownloaded waitUntilDone:NO]; 

重要的是將下載進度信息傳遞給主線程上的委託。委託人更新進度,不斷累積更改並在下載完成時或以更大的時間間隔進行保存。