对于使用Core Data的几个不同的提取重用NSFetchRequest有什么不好吗?

Pie*_*ter 4 xcode core-data nspredicate nsfetchrequest

我的问题:重复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];
Run Code Online (Sandbox Code Playgroud)

rge*_*rge 5

这不是问题,但在示例中,它并没有获得太多(只是一些代码简洁.)创建获取请求最昂贵的部分是解析谓词格式字符串.

如果您经常调用的代码被调用,并且您希望加快速度,那么可以尝试以下方法:

  • 只创建一次所有谓词和获取请求:可能在一个dispatch_once()块中并静态存储它们; 或者在构造函数中并存储在对象字段中
  • 不要指定排序描述符,因为如果您只关心计数,顺序无关紧要
  • 如果实际谓词比显示的更复杂或更灵活,请使用替换变量创建一个通用模板谓词,并用于predicateWithSubstitutionVariables:生成指定的副本.
  • 为了更加简洁,请使用模型编辑器在对象模型中定义该模板,并使用它fetchRequestFromTemplateWithName:substitutionVariables:来创建获取请求.

如果你愿意,我可以给你一些示例代码.