2011-07-13 46 views
1

我目前通過並行執行的多個線程執行多個網絡請求,因此每個線程都有一個託管對象上下文,並且每個線程都爲Core Data實體設置屬性值。所以這就是困境,每個網絡請求一次只能獲得少量數據,並且有數百(甚至數千)這些請求,並且我希望在所有網絡操作發生後執行保存(以便我可以安全地假設保存的數據意味着所有內容都已成功下載並寫入商店)。所以兩個問題:使用多重管理對象上下文問題

  1. 難道我救每個被管理對象上下文中的每個線程完成寫入上下文後,還是我存儲在內存中的所有管理對象的上下文,並在最後循環個個並進行保存? (寫完這些之後,很明顯移動存儲會是更有效的方法,但我仍然希望聽到您的想法。)
  2. 有什麼方法可以在不執行保存操作的情況下合併託管對象上下文嗎?我目前正在通過NSManagedObjectContextDidSaveNotification通知合併上下文,並想知道是否有另一種方式。

謝謝!

+0

你會產生「成千上萬」的線程/操作? – TechZen

+0

是啊,聽起來很蠢,我知道,但它不會一次全部實現,只有2或3個線程會同時運行。目的是從Web服務器提取數據。 – Stunner

回答

0

您可以爲所有線程創建控制器類,並僅使用一個託管上下文來保存數據。

線程完成下載後,調用ThreadControlerClass中的委託將數據與舊數據合併,然後在所有線程完成下載時保存。 如果你的數據太大,你可以做一些中間保存。

+0

我不明白這是如何工作的。在多個線程上運行相同的上下文會導致火車故障。 – TechZen

+0

不是在多個線程上,而是在一個將創建線程下載的線程上,並且在一個線程完成後,只需通知ThreadControllrClass,您已完成一些數據或失敗。 –

2

我看不出你如何「將所有託管對象上下文存儲在內存中,並在所有這些上下文中執行保存操作」。每個MOC都應該限制在它創建的線程中,因此我沒有看到如何在不違反此限制規則的情況下有效循環所有MOC ...但是您可能已經意識到已經...

我也相信通過NSManagedObjectContextDidSaveNotification合併MOC是最有效的方法。我甚至會爭辯說,在每次對象插入後保存MOC是最容易的(例如,當您導入數據時)。這樣你可以最小化每個合併的範圍!而且由於合併是在內存中執行的,所以它們的細粒度更少。

+0

+1這是唯一真正的解決方案。您可以基於另外兩個通知合併,但這會非常非常緩慢。 – TechZen

+0

感謝您的回覆。我給了它更多的想法,並且正在考慮明確地合併上下文甚至是不必要的,除非我想要刷新其他目前在內存中的MOC,這是正確的嗎?考慮到我正在導入數據,我不需要立即刷新它,我只能不合並,並且當我需要引用新數據時,我可以執行提取。你怎麼看?我是否正確思考這個問題? – Stunner

+0

上下文之間的溝通方式完全取決於您。換言之,主MOC在每次導入後具有的優點是,在導入完成後,您不必執行額外的提取操作。此外,它使您的主要MOC保持一致。如果你不關心這一點,你可以跳過合併。正如我所說,這完全取決於你,想想你的特定用例更有意義。 – octy

相關問題