2012-05-14 19 views
5

我們已經創建了一個存儲庫層,用於與核心數據進行交互,其中有方法,如allItems(),addItem:(Item*)item,其中項目是NSManagedObject子類。當我們需要保存一個項目時,我們調用存儲庫中傳遞子類實例作爲參數的方法。但是,這不起作用,因爲我們不能使用init初始值設定項,並且上下文隱藏在存儲庫中。如何在類之間傳輸NSManagedObject子類?

當你有這樣的架構時,傳輸對象的最佳方式是什麼? ItemDTO是通過一個選項來傳遞的嗎?還是有更好的方法來解決這個問題,比如根本不使用子類NSManagedObject,只是使用可用的鍵/值。

+0

你能解釋一下你的問題嗎?您的問題是您無法在存儲庫層之外創建新的託管對象,或者您以後無法保存對象? – jrturton

+0

問題是上下文在存儲庫層中是「隱藏」的,我不想泄露存儲庫層以外的內容。我想用它作爲抽象的堅實點。 – LuckyLuke

+1

您知道每個託管對象都有一個指向託管對象上下文的指針嗎?所以那個特別的貓就是這樣的。 – jrturton

回答

1

I 已寫入複製粘貼了隱藏模型自定義類的上下文的示例項目:branch 10583736

(這不是最終的生產代碼,只是一個簡單的例子,不要指望它來處理多線程或怪異的錯誤)

隱藏的背景下,以自定義類只是一個定義定製方法的事處理您通常會請求上下文並使用它的每種情況。

可以定義爲存儲層一類不暴露的情況下

@interface DataStore : NSObject 

+ (id)shared; 

- (void)saveAll; 
- (NSEntityDescription *)entityNamed:(NSString *)name; 
/* more custom methods ... */ 
- (NSManagedObject *)fetchEntity:(NSEntityDescription *)entity withPredicate:(NSPredicate *)predicate; 

@end 

我建議使用一個共同的祖先爲所有自定義模型類,以節省一些打字。這個類可以是唯一直接與DataStore交互的類。它無權訪問上下文。

@interface DataObject : NSManagedObject 

+ (NSString *)entityName; 
+ (NSEntityDescription *)entity; 
- (void)save; 
/* more custom methods ... */ 

@end 

最後模型的自定義類定義,你可能需要利用無論是通過超提供的任何方法:

@interface Card : DataObject 

@property (nonatomic, retain) NSString * question; 
@property (nonatomic, retain) NSString * answer; 
@property (nonatomic, retain) Deck *deck; 

/* return a new card */ 
+ (Card *)card; 

/* more custom methods ... */ 

@end 

分支下有個更常用的方法,即模型類獲得上下文並使用它。

3

通常情況下,您希望創建NSManagedObject子類的控制器具有指向NSManagedObjectContext的指針。這樣,你確實可以調用初始化器。

你想要做的事情的問題是,沒有上下文,項目不能存在。這是故意完成的,以便Core Data知道你是在談論一個新的對象還是一個已經存在於持久存儲中的對象。

您可以使用DTO,但最終會產生大量重複,所以它會變得很難看。在我看來,您應該考慮讓您的控制器知道Core Data上下文,以便它可以正確地檢索或初始化項目(管理對象),並且基本上使用NSManagedObjectContext作爲存儲庫層。

請記住,NSManagedObjectContext是一個持久性抽象層,如果需要,您可以使用其他持久性存儲實現進行備份,包括您自己的custom ones

5

我想說你正在使用的架構不適合核心數據。要繼續使用它(你應該),你必須做兩件事之一。我假設你的「存儲庫層」是作爲單例實現的,或者至少創建新的託管對象的對象可以訪問它。

  • 將您的託管對象上下文暴露給其他對象,通常作爲存儲庫層上的屬性。
  • 讓您的存儲庫層初始化併爲您返回對象。這將涉及傳入實體名稱並取回適當實體類型或類的新管理對象。

如果你發現自己的戰鬥框架,並想出過度抽象,你這樣做是錯誤的。

+0

最後的選擇是好的,謝謝!非常聰明 – LuckyLuke