0

アプリの1つでデータモデルを実行しています。このモデルでは、イベントに「eventType」関係が定義されています。これにより、「eventType」リレーションシップオブジェクトを変更することで、複数のイベントのルックアンドフィールを変更できます。

私が遭遇している問題は、イベントを挿入する前に、このオブジェクトのtypeRelationshipが以下のコードで存在するかどうかを確認することです。多数のオブジェクトを挿入する必要がある場合、これには時間がかかります。

このフェッチ要求の結果を(たとえばでNSMutableDictionary)キャッシュし、そのディクショナリ(ローカルメモリ)をチェックしNSManagedObjectて、指定されたでが存在するかどうかを確認できEventIDEnumますか?キャッシュを永久に存続させることはできますか、それとも、基になるオブジェクトがしばらくすると「古くなる」のでしょうか。

-(Event*)insertAndReturnNewObjectWithTypeID:(EventIDEnum)eventTypeID date:(NSDate*)date
{

    NSFetchRequest *eventTypesArray = [NSFetchRequest fetchRequestWithEntityName:@"EventType"];
    eventTypesArray.predicate = [NSPredicate predicateWithFormat:@"SELF.id == %d", eventTypeID];
    NSArray *eventTypes = [[DataManager sharedInstance].managedObjectContext executeFetchRequest:eventTypesArray error:nil];

    if(eventTypes.count==0)
    {
        DLog(@"ERROR inserting event with type: %i NOT FOUND",(int)eventTypeID);
        return nil;
    }
    else {

        if(eventTypes.count !=1)
        {
            DLog(@"ERROR found %i events with type %i",eventTypes.count,(int)eventTypeID);
        }

        EventType* eventType = [eventTypes lastObject];

        if(date)
        {
//            DLog(@"Returning object");
            return [self insertAndReturnNewObjectWithEventType:eventType date:date];
        }else {
//            DLog(@"Returning object");
            return [self insertAndReturnNewObjectWithEventType:eventType];
        }



    }
}

私の質問を見てくれてありがとう!

4

2 に答える 2

0

フェッチ要求によって返されたオブジェクトの配列はキャッシュできません。これらは、クエリに使用された NSManagedObjectContext が解放されていない限り有効です。NsManagedObject.objectID とクエリから取得したデータは、キャッシュして、好きなだけ保持できます。関連するデータと objectID を別のオブジェクトにコピーして、CoreData オブジェクトとは別にキャッシュして維持する方がよいでしょう。フェッチ要求によって返されたコア データ配列を解放します。

于 2012-10-24T15:58:02.360 に答える
0

使用しているパターンは、「検索または作成」と呼ばれることがよくあります。一意の特性が一致するオブジェクトを探し、存在する場合はそれを返し、存在しない場合は作成/入力/返します。

これを高速化するためにできることの 1 つは、Core Data の外部で一意化を行うことです。データに基づいて可能であれば、おそらく EventIDEnum 値を繰り返し処理し、必要な一意の値を見つけて、実行するフェッチの回数を減らすことができます。EventIDEnum ごとに 1 回だけ検索します。1 つのスレッド/コンテキスト内で作業している限り、それらをキャッシュできます。

この種のコードを書いているときは、NSManagedObjectContext をパラメーターとして渡すと便利です。これにより、メイン スレッド上またはプライベート キュー/コンテキスト内のどこでも、検索または作成または一括挿入メソッドを使用できます。それはあなたの[[DataManager sharedInstance] managedObjecContext]電話の代わりになります。

于 2013-03-27T18:36:18.867 に答える