5

NSFetchRequest私の質問: Core Data でいくつかの異なるフェッチに を再利用することについて何か悪いことはありますか?

コード例:

NSFetchRequest *request = [[NSFetchRequest alloc] init];

NSEntityDescription *logEntity = [NSEntityDescription entityForName:@"LogEntry" inManagedObjectContext:context];
[request setEntity:logEntity];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"dateTimeAction" ascending:NO]; // ascending NO = start with latest date
[request setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"status == %@",@"op tijd"];
[request setPredicate:predicate];
[request setFetchLimit:50];

NSError *error = nil;
NSInteger onTimeCount = [context countForFetchRequest:request error:&error];

NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"status == %@",@"uitgesteld"];
[request setPredicate:predicate1];
[request setFetchLimit:50];

NSInteger postponedCount = [context countForFetchRequest:request error:&error];

NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"status == %@",@"gemist"];
[request setPredicate:predicate2];
[request setFetchLimit:50];

NSInteger missedCount = [context countForFetchRequest:request error:&error];
4

3 に答える 3

5

これは問題ではありませんが、この例ではあまり効果がありません (コードが簡潔になっただけです)。

指定したコードが頻繁に呼び出され、それを高速化したい場合は、次のアイデアを試してみてください。

  • すべての述語を作成し、リクエストを一度だけ取得します。おそらくdispatch_once()ブロック内に静的に保存します。またはコンストラクターで、オブジェクトフィールドに格納されます
  • 並べ替え記述子を指定しないでください。カウントのみを気にする場合、順序は重要ではありません。
  • 実際の述語が示されているよりも複雑または柔軟な場合は、置換変数を使用predicateWithSubstitutionVariables:して 1 つの一般的なテンプレート述語を作成し、指定されたコピーを生成するために使用します。
  • コードをさらに簡潔にするために、モデル エディターを使用してオブジェクト モデルでそのテンプレートを定義し、それを使用fetchRequestFromTemplateWithName:substitutionVariables:してフェッチ要求を作成します。

必要に応じて、サンプル コードを作成できます。

于 2012-05-20T19:06:28.323 に答える
1

NSFetchedRequestこれは単なる検索基準記述子であり、さらに、次のようにフェッチされたリクエストに複数の述語を含めることができるため、問題ではないと思います。

NSPredicate *predicates = [NSCompoundPredicate andPredicateWithSubpredicates:NSArray_of_predicates];
于 2012-05-20T15:17:27.660 に答える