2010-07-23 70 views
0

我想知道是否有方法在同一個線程中運行的兩個或多個對象之間共享一個NSManagedObject核心數據中上下文之間共享非持久對象?

我有以下問題:我通過應用程序中的所有代碼共享一個主要上下文,併爲我發出的每個遠程獲取請求創建幾個不同的上下文。 (我創建了一個自定義類,它可以遠程獲取並在服務器中找到的所有對象都在自己的NSManagedObjectContext中)。這些提取請求可能會同時運行,因爲它們使用可能會在不同時間結束的對象NSURLConnection。如果同一個遠程對象被不同的連接獲取,那麼我將在保存和合並上下文的同時重複上述操作。 (即,具有相同遠程ID但不同的對象objectID)。

一個可能的解決方案是創建時立即保存(並堅持)每個對象,但我不能這樣做,因爲它可能有一些關係可能還沒有被填充並且不會在保存操作。

我真的很期待一種方法,允許您在上下文之間共享對象的同一個非持久性實例。如果有人遇到這個問題並提出解決方案,我會很高興知道!

回答

1

上下文無法通過其商店保存彼此之間的通信。但是,您可以插入托管對象與零管理對象上下文,它將獨立於任何上下文(儘管沒有關係)。無論您希望如何,都可以將該獨立管理對象傳遞給您,並在需要保留該對象時將其插入到上下文中。這是危險的,但可能的。

但是,如果您沒有在單獨的線程上運行每個連接,那麼通過使用多個上下文不會獲得任何收益。每個連接對象將在主線程上依次激活其委託。在這種情況下,最簡單的解決方案是對所有連接使用相同的委託,並讓委託處理插入到單個上下文中。爲防止重複,只需在remoteID上執行一次提取操作,並在爲該remoteID插入一個新對象之前查看是否返回一個現存對象。

+0

非常感謝您的回答。這真的很有幫助。使用單個上下文的唯一問題是,一旦遠程獲取請求中的一個已經結束,我就無法保存它,因爲可能還有其他請求尚未從服務器獲取某些非可選關係對象(從而取消保存操作)。我目前正在這樣做,但我想避免的是等待所有提取請求完成保存和合並主要上下文中的對象。我想這個問題沒有解決辦法,因爲通過零將是不夠的... – eugeniodepalo 2010-07-23 13:16:18

0

我不認爲你想要做什麼是可能的。我的意思是,如果你想在不同的上下文之間分享變化,你必須使用通知並在保存或變更時進行合併。但在你的情況下,我會說只使用1個上下文並保存到最後。或者不那麼優雅的方式:將所有遠程ID臨時保存在您的應用程序中,並在插入新ID之前進行檢查。在這種情況下,您可以繼續使用多個上下文,並在每次完成加載後保存。

相關問題