2012-09-30 64 views
2

我使用核心數據並有一個對象ExerciseForRoutine。我目前手動創建它,然後設置屬性,這似乎浪費了代碼。有沒有什麼辦法可以創建自定義init()方法在一行來處理這個(我知道該怎麼做左右分配/ init,但是核心數據有不同的init()方法..)我可以爲核心數據模型對象使用自定義初始值設定項嗎?

目前代碼:

ExerciseForRoutine *exerciseForRoutine = (ExerciseForRoutine *)[NSEntityDescription insertNewObjectForEntityForName:@"ExerciseForRoutine" inManagedObjectContext:managedObjectContext]; 
exerciseForRoutine.name = self.selectedExercise; 
exerciseForRoutine.timeStamp = date; 
exerciseForRoutine.muscleGroup = self.muscleName; 
exerciseForRoutine.musclePicture = self.muscleURL; 

ExerciseForRoutine類

@class Routine; 

@interface ExerciseForRoutine : NSManagedObject { 
@private 
} 
@property (nonatomic, strong) NSDate * timeStamp; 
@property (nonatomic, strong) NSString * name; 
@property (nonatomic, strong) NSString * muscleGroup; 
@property (nonatomic, strong) NSString * musclePicture; 
@property (nonatomic, strong) Routine * exerciseToRoutine; 

@end 

@implementation ExerciseForRoutine 
@dynamic timeStamp; 
@dynamic name; 
@dynamic muscleGroup; 
@dynamic musclePicture; 
@dynamic exerciseToRoutine; 
+0

你不應該重寫初始化。有關信息[對象生命週期初始化和釋放]的文檔(https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdManagedObjects.html#//apple_ref/doc/) uid/TP40003397-SW2) –

回答

0

其Xcode創建用於處理核心數據對象的類不應該被重寫,而不是你可以做的是創造出從NSObject的繼承自己的自定義類,並用你的方法來處理管理反對他們的。

索爾:你可以做到這一點與參數init方法的幫助下

然後,它會是這個樣子

 
CoreDataHelperClass *someobj = [[CoreDataHelperClass alloc]initWithname:@"name" andTimeStamp:@"Time" andMuscleGroup:@"musclegroup" andPicture:UIImagePNGRepresentation(someimageObj)]; 

上面做,你需要添加自己的init方法在CoreDataHelperClass類這樣

CoreDataHelperClass

 

- (id)initWithName:(NSString*)name andTimeStamp:(NSString*)timeStamp andMuscleGroup:(NSString*)group andPicture:(NSData*)imageData; 

的.H部分CoreDataHelperClass的10

.M部分

 

- (id)initWithName:(NSString*)name andTimeStamp:(NSString*)timeStamp andMuscleGroup:(NSString*)group andPicture:(NSData*)imageData 
{ 

//you assignment code to the core data attributes goes here 

ExerciseForRoutine *obj = [[ExerciseForRoutine alloc]init]; 

obj.name = name; 
obj.timestamp = timeStamp; 

//and so on 

return self; 

} 


反正你也可以做的是什麼傳遞一個字典的鍵值對獲得您的自定義類中的值,或者您也可以傳遞一個NSMutableArray像什麼都適合你的商業模式都將工作。

您可以在CoreDataHelperClass中獲取Dictionary或Array的值,並將這些值分配給您的屬性。

希望我有你查詢的權利,如果沒有,那麼親切更不用說通過評論

+0

您不應該覆蓋被管理對象的init。文件很清楚。請編輯您的問題以適應它。 –

+0

@Flex_Addicted:我沒有說明在託管對象類中的任何類型的定製,我說的是創建自己的類和管理託管對象,我覺得這是非常可行的,並且不違反任何蘋果規範。 – Radix

+0

好的,抱歉...我誤解了答案。乾杯。 –

0

錯誤部分要添加到@板藍根的答案,你應該考慮使用mogenerator,因爲它會爲你做多,子類業務。

http://rentzsch.github.io/mogenerator/

的指南見here來設置它,並讓它在XCode中運行5

有一個小警告要提防是:如果你得到一個斷言失敗,上面寫着:

-[MOGeneratorApp setModel:] blah blah blah 

那麼你應該指向mogenerator.xcdatamodel文件.xcdatamodeld包在你的運行腳本階段內,像這樣:

mogenerator -m Model.xcdatamodeld/Model.xcdatamodel -O Project/Model --template-var arc=true 

其中Project是您的項目的名稱,Model是您的模型的名稱。

參見https://github.com/rentzsch/mogenerator/issues/169

1

我這樣做是使用awakeFromInsert和awakeFromFetch。

從蘋果公司的文檔:

在一個典型的可可類,你通常重載指定初始化函數(通常init方法)。在NSManagedObject的子類中,有三種不同的方式可以自定義初始化 - 通過覆蓋initWithEntity:insertIntoManagedObjectContext:,awakeFromInsert或awakeFromFetch。你不應該重寫init。您不鼓勵重寫initWithEntity:insertIntoManagedObjectContext:因爲此方法中的狀態更改可能無法與撤銷和重做進行正確集成。

https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreData/Articles/cdManagedObjects.html

相關問題