2

Core Dataを使用していて、オブジェクトがありますExerciseForRoutine。現在、手動で作成してから属性を設定しているため、コードが無駄になっているようです。これを1行で処理するカスタムinitメソッドを作成する方法はありますか(alloc / 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;
4

3 に答える 3

1

これは、awakeFromInsertとawakeFromFetchを使用して行いました。

Appleのドキュメントから:

通常のCocoaクラスでは、通常、指定された初期化子(多くの場合initメソッド)をオーバーライドします。NSManagedObjectのサブクラスでは、初期化をカスタマイズする3つの異なる方法があります。initWithEntity:insertIntoManagedObjectContext:、awakeFromInsert、またはawakeFromFetchをオーバーライドすることです。initをオーバーライドしないでください。このメソッドで行われた状態の変更は、undoおよびredoと適切に統合されない可能性があるため、initWithEntity:insertIntoManagedObjectContextをオーバーライドすることはお勧めしません。

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

于 2015-03-26T13:57:55.630 に答える
0

Xcodeがコアデータオブジェクトを処理するために作成するクラスはオーバーライドしないでください。代わりに、NSObjectから継承する独自のカスタムクラスを作成し、管理対象オブジェクトを処理するメソッドを記述します。

Sol:パラメータ化されたinitメソッドの助けを借りてこれを行うことができます

するとこんな感じになります

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

上記を行うには、次のようにCoreDataHelperClassクラスに独自のinitメソッドを追加する必要があります。

CoreDataHelperClassの.h部分

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

CoreDataHelperClassの.m部分

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

//コアデータ属性へのコードの割り当てはここにあります

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

obj.name=名前;
obj.timestamp = timeStamp;

//等々

自己を返す;

}


とにかく、キーと値のペアを使用してディクショナリを渡すことでカスタムクラスの値を取得することも、ビジネスモデルに適したNSMutableArrayを渡すこともできます。

CoreDataHelperClass内のDictionaryまたはArrayの値を取得し、それらの値を属性に割り当てることができます。

そうでない場合は、コメントでエラー部分に言及してください。

于 2012-09-30T03:42:59.247 に答える
0

@Radixの回答に追加するにmogeneratorは、サブクラス化ビジネスの多くを実行するため、使用を検討する必要があります。

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

セットアップしてXCode5で実行するためのガイドについては、こちらを参照してください。

ただし、注意すべき小さな注意点があります。次のようなアサーションエラーが発生した場合:

-[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を参照してください。

于 2014-03-25T14:39:50.440 に答える