0

我正在使用 RestKit 将数据导入核心数据存储,并且需要检查重复项。如果该商品已在商店中,我想使用最新属性对其进行更新。如果它是一个新项目,我想创建它。

导入很慢,所以我使用 Instruments 并看到导入的最长部分是检查项目是否已经存在(使用 fetch 请求)

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

  • 使用 countForFetchRequest 查看 item 是否已经存在,然后执行 FetchRequest 返回 item 进行更新或
  • 只需执行FetchRequest 以获取要更新的项目
  • 还是有更好的方法来做到这一点?

我认为 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;

}

4

1 回答 1

3

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

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

我真的建议您阅读我提供的链接。你会看到你的表演加速了。

显然你应该在后台完成工作,防止主线程冻结,使用线程限制或新的 iOS Core Data queue API。

希望有帮助。

于 2012-09-14T11:09:58.000 回答