2011-09-21 80 views
1

我有一個應用程序,我正在努力。有導航控制器,並且我的appDelegate正在經過其managedObjectContext到的資產淨值控制器根控制器像這樣:傳遞managedObjectContext - 這是否有效?

RootViewController *rootViewController = (RootViewController *)[navigationController topViewController]; 
rootViewController.managedObjectContext = self.managedObjectContext; 

(獎金的問題 - 我已閱讀上述內容是通過上下文中的優選方式,如相反的一些例子,我看到視圖控制器從委託獲取上下文的位置 - 這是正確的嗎?另外,我需要釋放上面的rootViewController,還是我正確的是它是自動釋放的,因爲它不是使用alloc或new創建的? )

無論如何,該應用程序的主視圖有一個按鈕 - 單擊時,它會記錄時間戳並將其保存在覈心數據中。然後,應用程序會顯示第二個視圖,這是用戶要使用數據子集的位置。第二個視圖允許用戶選擇查看當前周,月或年的所有時間戳。

我最初的想法是將managedObjectContext從rootVC傳遞給detailVC,並在detailVC中執行數據讀取和查詢。這是正確的方式去做這件事,或者更好地在rootVC執行查詢並將數據作爲數組或東西傳遞給細節控制器?或者除組織之外沒有任何區別(沒有表現差異) - 其中一個是六個,另一個是六個?

回答

4

你不必擔心這種效率,它會執行很好的方式 - 你只是通過一個指針。這並不是說這是一個很好的方式去做事情。

Apple's Core Data templates are pretty terrible。一般來說,最好將您的數據管理分解爲一個單獨的管理員類,負責管理您的數據。

+0

所以,數據管理類將包含所有核心數據的東西(managedobjectcontext等)? VC如何獲取他們的數據,將查詢傳遞給管理類並接收數組或類似數據?你知道我在哪裏可以看到一個使用這種架構的示例項目嗎? – Jim

+0

哇,我怎麼錯過你發佈的鏈接?這是一個很好的例子,謝謝 – Jim

1

我發現傳遞一個託管對象上下文(MOC)是有點痛苦。特別是如果你需要在許多不同的地方訪問它,你知道會懷疑

通常,我所做的是創建一個類來處理各種核心數據位和bobs。我把這個單身人士用一個電話隨時隨地存取。然後我調用這個方法來獲得MOC。例如:

myMOC = [[MyPersistentStoreController sharedMyPersistentStoreController] managedObjectContext]]; 

有關如何輕鬆創建一個單獨的信息,看看Matt Gallagher's blog.

+0

+1鏈接到馬特的單身職位 - 謝謝 – Jim

2

我認爲通過商務部在你的視圖控制器,當你在你的問題說,是一個很好的做法。 MVC模式背後的想法是,視圖控制器負責業務邏輯,所以如果你傳遞給它的MOC(它在模型的最後),你讓第二個視圖控制器能夠執行自己的業務邏輯獨立於任何其他視圖控制器。

相反,如果您決定在第一個視圖控制器上執行查詢,然後將結果傳遞給第二個視圖控制器並最終傳回第一個視圖控制器,第二個視圖控制器發生更改,則會增加額外的複雜性第一個視圖控制器,除了在兩個視圖控制器之間添加一個雙向鏈接(因此一個VC中的任何更改都需要更改爲另一個!),最後您將第二個視圖控制器基本上減少爲具有某些功能但沒有模型交互的視圖。

最後,您可以像在另一篇文章中建議的那樣,使用一個負責所有MOC交互的單例。但在我看來,採用這種方法,您將在由MOC代表的現有管理層之上添加額外的管理層。當你想擺脫視圖控制器中的所有業務邏輯時,這種方法是有意義的,但當需要由多個視圖控制器共享許多複雜活動時,通常需要這樣做:但在這種情況下,可能是時候考慮了關於您的應用程序的不同組織。

最後我回答你的獎金問題:你不需要釋放視圖控制器,不要這樣做!直到它位於導航控制器內部並且您沒有釋放導航控制器時,您的視圖控制器纔不會被解除分配。

+0

+1 - 最後,我決定單身解決方案更適合我的特定項目,但我發現你的回答很有見地。它絕對看起來最好的解決方案取決於你正在工作的應用程序有多複雜。感謝這篇文章 – Jim