カスタム NSManagedObject を通常のオブジェクト (および通常の関数) のように使用したいと考えています。通常のオブジェクトのように初期化できるようにクラスを変更することは可能ですか?
[[myManagedObject alloc] init];
ありがとう
編集:質問を明確にするために、実装で @dynamic を @synthesize で変更すると、すべてが台無しになりますか?
カスタム NSManagedObject を通常のオブジェクト (および通常の関数) のように使用したいと考えています。通常のオブジェクトのように初期化できるようにクラスを変更することは可能ですか?
[[myManagedObject alloc] init];
ありがとう
編集:質問を明確にするために、実装で @dynamic を @synthesize で変更すると、すべてが台無しになりますか?
私は自分のアプリの1つでこれを頻繁に行います。私のアプローチは、オブジェクトを次のように初期化することです。
-(id)initWithEntity:(NSEntityDescription *)entity insertIntoManagedObjectContext:(NSManagedObjectContext *)context
コンテキストにnilを渡します。エンティティの説明を取得するには、managedObjectContextにアクセスする必要があります。私は、アプリの起動時にエンティティの説明を取得し、それをアプリデリゲートのインスタンス変数に格納する傾向があります。
次に例を示します。
//inside my "Engine" class
self.tweetEntity = [NSEntityDescription entityForName:@"Tweet" inManagedObjectContext:self.moc];
//later on when I want an NSManagedObject but not in a managed object context
Tweet *tweet = [[[Tweet alloc] initWithEntity:self.engine.tweetEntity insertIntoManagedObjectContext:nil] autorelease];
これにより、データベースに保存せずにNSManagedObjectsを使用できます。後で、オブジェクトをデータベースに挿入することにした場合は、管理対象オブジェクトのコンテキストに挿入することで実行できます。
[self.moc insertObject:tweet];
管理対象オブジェクトコンテキストはNSManagedObjectの必須プロパティであるため、コンテキストに挿入せずにインスタンスを適切に初期化することはできません。コンテキストを調べてそのエンティティを理解し、プロパティのいずれかが変更されたときにコンテキストに通知します。
@dynamicと@synthesizeは、単なるコンパイラ指令です。適切なゲッターとセッターを自分で提供する限り、@dynamicから@synthesizeに切り替えることができます。NSManagedObjectは、機能するためにKey-Valueの監視に大きく依存しているため、KVO準拠のアクセサーを作成する必要があります。
NSManagedObjectサブクラスを初期化する必要がある場合は、オーバーライドawakeFromInsert
して、インスタンスの作成時にインスタンスにカスタマイズを提供できるようにします。を使用して、オブジェクトをフェッチするたびにオブジェクトをカスタマイズすることもできますawakeFromFetch
。