我正在后台队列中的子 moc 中进行数据处理。我需要按 ID 查询数据库,以便我可以区分更新现有对象和创建新对象。我发现大部分时间(50 项的总处理时间约为 2 秒)都被 executeFetchRequest:error:
消耗了。 NSPredicate
是最简单的形式——只匹配单个 ID 属性(ID 属性已经被索引),NSFetchRequest
应该返回一个或没有(ID 是唯一的) .有没有办法优化这种NSFetchRequest
?
这是我当前的代码:
+ (User *)userWithID:(NSNumber *)ID inManagedObjectContext:(NSManagedObjectContext *)context {
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"User"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ID == %@", ID];
[fetchRequest setPredicate:predicate];
[fetchRequest setFetchBatchSize:1];
NSError *error = nil;
NSArray *users = [context executeFetchRequest:fetchRequest error:&error];
if (error) {
abort();
}
if ([users count] == 1) {
return [users objectAtIndex:0];
} else if ([users count] > 1) {
// Sanity check.
…
} else {
return nil;
}
}
最佳答案
正如@ChrisH 在问题下的评论中指出的那样,对每个 ID 进行提取是不好的。所以我将处理流程更改为:
- 第一次枚举数据以提取 ID。
- 执行一次获取以获取所有匹配 ID 的现有用户,并将它们放入由 ID 键控的字典中(命名为
existingUsers
)。 - 第二次枚举数据以进行真正的处理:在每次迭代中,要么更新在
existingUsers
中找到的一个现有用户,要么创建一个新用户,将其添加到existingUsers
如果是新的。
代码几乎翻了一番,但性能也是如此。非常好的权衡!
关于ios - 有什么方法可以为单个对象优化简单的 NSFetchRequest 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12694175/