2012-06-06 68 views
2

只是尋找一點點反饋意見,看看這是否是共享託管對象上下文的不好主意。使用#DEFINE共享託管對象上下文

MyApp-Prefix.pch文件我已經添加以下內容:

#import "AppDelegate.h" 
#define MOC [(AppDelegate*)[UIApplication sharedApplication].delegate managedObjectContext] 

然後,當我需要訪問我做了以下(只是一個例子)上下文:

[MOC deleteObject:[self.fetchedResultsController objectAtIndexPath:indexPath]]; 

這似乎工作的偉大,但它也似乎太容易了,特別是因爲我沒有看到它在任何地方提到。這是一個糟糕的設計模式嗎?

感謝您的任何反饋

+0

介紹全局變量的好方法......這反過來在你的代碼中引入了隱藏的依賴關係,使得重構變得更加困難,並且難以單獨測試。 –

+0

下面的兩個答案都涉及到[在這裏]討論的設計模式問題(http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html)。當這樣的問題出現時,值得一讀。 – Swizzlr

回答

2

而不是一個編譯器宏(這有時會引起驚喜)我通常在我的應用程序委託定義一個類的方法,就像這樣:

+ (AppDelegate *)sharedDelegate 
{ 
    return [[UIApplication sharedApplication] delegate]; 
} 

然後,當我需要一些全局狀態的參考,我可以這樣調用:

[[[AppDelegate sharedDelegate] managedObjectContext] deleteObject:foo]; 

如果你的應用是足夠複雜,它可能是值得圍繞基準傳遞到託管對象上下文,而不是使用一個全球性的麻煩。如果這樣做,稍後重構和使用其他技術變得更加容易,如兒童上下文對變化進行分組。

具體來說,這意味着每個視圖控制器都有自己的managedObjectContext實例變量。當你呈現一個新的視圖控制器時,你傳遞一個引用:也許在一個自定義的init方法中,也許通過設置一個屬性。您的任何類(除了可能的根視圖控制器)都會引用您的全局應用程序委託。這樣,如果你有一個複雜的編輯視圖,你可以給它一個子上下文,它可以「暫時」保存更改(以驗證所有對象是有效的);如果用戶點擊取消按鈕,則只需將整個背景扔掉即可。

此外,如果您始終使用全局上下文,則可能有難以追蹤的錯誤。例如,一個編輯視圖在自身留下無效對象之後不會清理。然後下一次你去保存一些不相關的東西,你會得到一個錯誤!發生在我身上的是調試沒有趣味。

+0

謝謝你,只是爲了澄清一件小事。當人們說'傳遞上下文而不是使用全局'時,他們的意思是在viewDidLoad中執行'self.moc = [[AppDelegate sharedDelegate] managedObjectContext]'而不是直接總是直接使用'[[AppDelegate sharedDelegate] managedObjectContext]''你需要它的地方?還是比這更重要的是,我猜測我錯過了所有這一切中的一個關鍵點,因爲我不明白爲什麼其中一個比另一個好。 – Brad

+0

@ br4d是的,你錯過了一個關鍵點。 :-)我澄清了我的答案,讓我知道這是否有幫助。 – benzado

+0

啊,謝謝你,這有助於一噸。 – Brad

0

沒有錯的做法 - 但除非委託的管理對象上下文去你的程序的生命週期內改變,它似乎更爲明智和有效地使用全局變量。 Cocoa AppKit框架採用第二種方法與NSApp變量設置爲[NSApplication sharedApplication]