3

在一個應用程序中,可能有不同的UIViewController需要共享相同的NSManagedObject。我通常做到以下幾點:在UIViewControllers中傳遞NSManagedObjects的食譜

@interface CustomController : UIViewController 

@property (nonatomic, retain) ProductNSManagedObject* productManaged; 

@end 

後來,當我istantiate CustomController我把它注射類似如下:

customController.productManaged = .... 

做一次,CustomController負責將其釋放。

這種方法效果很好(我不知道它是否正確),但是當控制器需要這個對象但是它不是控制器的直接子對象時該怎麼做?例如

MainController -> ChildController -> SubChildController -> .... 

其中MainController有管理的對象。

我是否必須創建大量的中介屬性,還是需要執行新的NSFetchRequest或其他?

相同的方面可以應用於NSManagedObjectContext。搜索周圍我發現上下文可以從擁有它的應用程序委託中獲取(如果有的話)。但是這種方法缺乏靈活性,因爲Marcus Zarra在passing-around-a-nsmanagedobjectcontext-on-the-iphone中寫道。

有什麼建議嗎?先謝謝你。

回答

1

這是一個非常常見的問題(有關的問題見herehere)。正如我在相關問題的答案中所寫的,您應該遠離單例,並創建一個獨立的對象來處理對象實例化,併爲您的應用程序創建對象圖。這個單獨的對象可以持有對所有共享對象的引用,並將它們提供給正在構建的對象,以便您的任何常規對象都不必保留引用,只是將它作爲依賴項傳遞給其他對象。請參閱此blog post以獲取更多關於防止單身人士濫用和進一步提示的理由,特別是MiškoHevery的文章。

我創建了一個sample Xcode project,它顯示瞭如何在沒有單例的情況下連接應用程序,保持低耦合並解決其他單例問題。目前非常簡單,我稍後會添加更多常見用例。

+0

感謝您的回覆,併爲您的建議+1。但是你的意思是什麼*這個獨立的對象可以持有對所有共享對象的引用,並將它們提供給正在構建的對象,這樣你的任何常規對象都不得不保留對某些東西的引用,只是將它作爲依賴項傳遞給其他對象。*?也許當你創建你的示例項目時,讓我知道。 – 2012-02-24 08:41:43

+0

我剛讀完你的答案。它們很有用。該方法似乎非常乾淨,但我不明白的是如何引用與* Factory * factory = [[Factory alloc] init] *在整個應用程序中連接的對象*工廠*。再次感謝你。 – 2012-02-24 08:48:06

+0

查看編輯,示例項目應該清楚。 – zoul 2012-02-24 08:56:19

2

我創建了一個包含將在整個應用程序中使用的託管對象上下文的單例對象。我在這個單例中放入了與數據相關的任何支持代碼(例如,持久存儲協調器),並將所有視圖和控制器信息與它們分開。

在一種情況下,我需要另一個線程的託管對象上下文。很明顯,重構並將該上下文放在同一個單例中是有用的。然後可以在單例內完成兩個上下文之間的合併。

這幫助我管理我的代碼。你可能會考慮它。

+0

+1您的建議。但是** NSManagedObject **對象呢?你知道在控制器之間傳遞它們的正確方法嗎?謝謝。 – 2012-02-23 20:13:18

+0

您是否訪問該單例中的託管對象? – 2012-02-23 20:19:23

+1

通常我爲每個視圖控制器使用一個抓取的結果控制器。它跟蹤對特定視圖很重要的被管理對象。獲取的結果控制器通過單例綁定到託管對象上下文。這樣,如果託管對象上下文通過任何視圖中的操作進行更改,則綁定到其他視圖的frc可以響應並調用其委託方法。 – Jim 2012-02-23 20:32:39