ios - 有什么方法可以为单个对象优化简单的 NSFetchRequest 吗?

标签 ios core-data nsfetchrequest

我正在后台队列中的子 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 进行提取是不好的。所以我将处理流程更改为:

  1. 第一次枚举数据以提取 ID。
  2. 执行一次获取以获取所有匹配 ID 的现有用户,并将它们放入由 ID 键控的字典中(命名为 existingUsers)。
  3. 第二次枚举数据以进行真正的处理:在每次迭代中,要么更新在 existingUsers 中找到的一个现有用户,要么创建一个新用户,将其添加到 existingUsers如果是新的。

代码几乎翻了一番,但性能也是如此。非常好的权衡!

关于ios - 有什么方法可以为单个对象优化简单的 NSFetchRequest 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12694175/

相关文章:

ios - 延迟在 UITableView 中插入行

ios - 通过 for 循环中的 1 行填充类属性?

ios - CABasicAnimation 在完成 1 个循环后回到原来的位置

core-data - 核心数据/iCloud 播种与本地 xml 文件在 iOS8 中抛出错误

ios - 如何最好地子类化 NSManagedObject 以提供一组核心方法

swift - 关系属性的核心数据获取请求

ios - 从NSMutableArray删除空NSString的最快方法是什么?

cocoa - 将新元素添加到 NSManagedObject

ios - NSFetchedResultsController UITableView 的多个实体

ios - 导入 CoreData 时检查重复项