2014-10-09 80 views
0

我從Core Data數據模型生成此NSManagedObject子類:初始化一個NSManagedObject的子類的子類

@interface Customer : NSManagedObject 
@property (nonatomic, retain) NSNumber * id; 
@property (nonatomic, retain) NSString * firstName; 
@property (nonatomic, retain) NSString * familyName; 
@end 

我的應用程序的邏輯使我定義這個Customer類的子類,以擴展其性能和提供了一些方法,讓他們從我的數據模型生成的類分開:

@interface ExtCustomer : Customer 
@property (nonatomic, retain) NSNumber *modificationDate; 
+ (ExtCustomer *)parseJsonData:(NSData *)jsonData; 
@end 

我並不需要堅持這個modificationDate財產,我要的是使用ExtCustomer對象在整個應用中代替Customer對象,但僅在需要時才通過Core Data保存Customer屬性。

我試圖實例ExtCustomer調用init,但這似乎是不可能的,因爲它從NSManagedObject繼承,所以我試圖做到這一點:

+ (ExtCustomer *)createExtCustomerInContext:(NSManagedObjectContext *)context 
{ 
    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Customer" inManagedObjectContext:context]; 
    ExtCustomer *customer = [[ExtCustomer alloc] initWithEntity:entityDescription insertIntoManagedObjectContext:context]; 

    [customer setFamilyName:@""]; 
    [customer setFirstName:@""]; 

    return customer; 
} 

但我看到的是,即使我投的對象(return (ExtCustomer *)customer;),我實際得到的是一個Customer對象。 由於我沒有在我的數據模型中定義ExtCustomer實體,我想我只能得到的NSEntityDescription。 我怎麼解決這個問題?

在此先感謝

回答

0

BTDT,我不能推薦這樣做。

當您編輯模型並要求xcode生成類文件時,xcode將覆蓋該模型類文件中的所有更改(以及任何代碼擴展名)。我確實試圖通過以各種方式擴展模型類來分離模型類定義和模型邏輯,但是結果是在應用程序的後期階段發現了很多問題。

所以基本上你想要做的是而不是讓xcode重新創建你的類文件。在對模型進行更改後,您要手動更新模型文件。只有當屬性的類型或名稱更改時才需要更新類文件。

此過程確實需要一點訓練,但比模型類的任何類別或擴展更容易維護和管理。

此外,我建議保持模型類以外的邏輯。在模型類中添加邏輯以對屬性值(或更改)作出反應是很有誘惑力的。但是在評估這種方法時,考慮一下你的managedObject是相當短暫的。不要在你的應用中傳遞它。 managedObject可能會變成錯誤,您的邏輯將無法再被訪問。

考慮將邏輯移動到一個單獨的類中,不會繼承NSManagedObject形式。複製特定任務所需的屬性並在該單獨的類中執行所需的邏輯。這個階級不會對你造成任何錯誤,你會對上下文有更多的自由。

0

不幸的是你的方式不是線程安全的。即使你用一些仍然是managedObject的東西來擴展managedObject。您不應該通過應用保留管理對象。基本上,每次你想使用Customer/ExtCustomer值或使用fetchedResultConnroller與核心同步時,你必須從內核中獲取數據。

最簡單的解決方案是將修改日期添加到核心並將其保留在那裏。

編輯:

如果你不想觸及核心數據,那麼你可以創建ExtCustomer延長NSObject的。添加與客戶+新的字段相同的字段,並讓他們通過應用程序。但是在這種情況下,您必須每次同步核心Customer對象和您的ExtCusomers數組。不是一個好辦法,但可能對你的解決方案好

+0

我發現的問題是,我實際上並沒有得到'ExtCustomer'對象,而是'Customer'。我想要分開的類,因爲相反,如果我需要重新生成我的模型類,我需要再次將我的自定義屬性和方法添加到已經生成的類代碼中... – AppsDev 2014-10-09 06:46:11

+0

當您獲取您寫入的對象... entityForName:@「Customer」...這意味着您獲取Customer對象但不是ExtCustomer。我沒有看到任何黑客解決方案。我認爲你可以做的最好的事情是將客戶對象擴展到核心,那麼你將在覈心中擁有2個對象。但它不能解決再生問題。也許可以使它更容易。 – kabarga 2014-10-09 06:54:26

+0

更新了答案 – kabarga 2014-10-09 07:12:50