2

ドキュメントによると:

init をオーバーライドしないでください。initWithEntity:insertIntoManagedObjectContext をオーバーライドしないことをお勧めします。

代わりに awakeFromInsert または awakeFromFetch を使用する必要があります。

何らかの属性を現在の日付などに設定するだけであればこれで問題ありませんが、別のオブジェクトを送信してその情報に基づいて属性を設定したい場合はどうすればよいでしょうか?

たとえば、'Item' と呼ばれる NSManagedObject サブクラスでは、アイテムの名前がモノの名前に設定されている initFromOtherThing:(Thing *) モノが必要です。アイテムを作成した直後に毎回名前を設定するために「覚えておく必要がある」ことや、アイテムに Thing に基づいて別のデフォルト属性も設定するように決定したときに 15 の異なるコントローラー クラスを更新しなければならないことを避けたいと思います。これらは、モデルに関連付けられたアクションです。

これをどのように処理するつもりですか?

4

1 に答える 1

1

これを処理する最善の方法は、NSManagedObjectをサブクラス化してから、オブジェクトに追加するものを保持するカテゴリを作成することだと思います。たとえば、一意化して便利に作成するためのいくつかのクラスメソッド:

+ (item *) findItemRelatedToOtherThing: (Thing *) existingThing inManagedObjectContext *) context {
    item *foundItem = nil;
    // Do NSFetchRequest to see if this item already exists...
    return foundItem;
}

+ (item *) itemWithOtherThing: (Thing *) existingThing inContext: (NSManagedObjectContext *) context {
    item *theItem;
    if( !(theItem = [self findItemRelatedToOtherThing: existingThing inManagedObjectContext: context]) ) {
        NSLog( @"Creating a new item for Thing %@", existingThing );
        theItem = [NSEntityDescription insertNewObjectForEntityForName: @"item" inManagedObjectContext: context];
        theItem.whateverYouWant = existingThing.whateverItHas;
    }
    return theItem; 
}

initWithEntity:insertIntoManagedObjectContext:次のような便利なクラスメソッドを使用して、直接呼び出すことは絶対にしないでください。

item *newItem = [item itemWithOtherThing: oldThing inContext: currentContext];
于 2012-05-07T22:54:27.690 に答える