0

RestKit を使用してコア データ ストアにデータをインポートしており、重複をチェックする必要があります。商品がすでにストアにある場合は、最新の属性で更新したいと思います。新品なら作りたいです。

インポートが遅かったので、Instruments を使用しましたが、インポートの最も長い部分は、項目が既に存在するかどうかを確認することでした (フェッチ要求を使用)。

そのため、アイテムがすでにストアにあるかどうかを確認したいのですが、次のほうが速いですか?

  • countForFetchRequest を使用して項目が既に存在するかどうかを確認し、次に executeFetchRequest を使用して更新する項目を返すか、
  • 更新するアイテムを取得するためにFetchRequestを実行するだけです
  • またはこれを行うためのより良い方法はありますか?

NSManagedObject 全体が返されず、NSManagedObject が存在することがわかっている場合にのみフェッチ要求を実行するため、countForFetchRequest の方が高速であると考えました。

ありがとう

- (Product *)productWithId:(int)productID {

    NSManagedObjectContext *context = [Model sharedInstance].managedObjectContext;
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"product_id == %d", productID];
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    request.entity = [NSEntityDescription entityForName:@"Product" inManagedObjectContext:context];
    request.predicate = predicate;
    request.fetchLimit = 1;

    NSError *error = nil;

    NSUInteger count = [context countForFetchRequest:request error:&error];

    if (!error && count == 1) {
        NSArray *results = [context executeFetchRequest:request error:&error];
        if (!error && [results count]) {
            return [results objectAtIndex:0];
        }
        return nil;
    }

    return nil;

}

4

1 に答える 1

3

私の知る限り、Core Data 内のオブジェクトを検索および/またはインポートする最良の方法は、Implementing Find-or-Create Efficientlyで説明されています。

ドキュメントでは、データの並べ替えに基づく検索または作成パターンについて説明しています。サービスからダウンロードしたデータと、ストアから取得したデータです。

私が提供したリンクを読むことを本当にお勧めします。パフォーマンスのスピードアップが見られます。

明らかに、スレッドの制限または新しい iOS Core Data キュー API を使用して、バックグラウンドで作業を行い、メイン スレッドがフリーズするのを防ぐ必要があります。

それが役立つことを願っています。

于 2012-09-14T11:09:58.000 に答える