导入CoreData时检查重复项

时间:2012-09-13 22:15:47

标签: ios performance core-data restkit nsfetchrequest

我正在使用RestKit将数据导入Core Data存储,需要检查重复项。如果该商品已经在商店中,我想用最新的属性更新它。如果它是一个新项目,我想创建它。

导入速度很慢所以我使用了Instruments并看到导入的最长部分是检查项目是否已经存在(带有获取请求)

所以我想知道是否检查项目是否已经在商店中,是否更快:

  • 使用countForFetchRequest查看该项是否已存在,然后使用executeFetchRequest返回要更新的项或
  • 只是executeFetchRequest以获取要更新的项目
  • 或者有更好的方法吗?

我认为countForFetchRequest会更快,因为没有返回整个NSManagedObject,只有当我知道将会有一个NSManagedObject时才执行获取请求。

由于

- (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;

}

1 个答案:

答案 0 :(得分:3)

据我所知,在Implementing Find-or-Create Efficiently中描述了在核心数据中查找和/或导入对象的最佳方式。

该文档描述了基于排序数据的查找或创建模式:从服务下载的数据以及从商店中获取的数据。

我真的建议你阅读我提供的链接。你会看到你的表现加快。

显然你应该在后台完成工作,防止主线程冻结,使用线程限制或新的iOS核心数据队列API。

希望有所帮助。