我正在使用RestKit将数据导入Core Data存储,需要检查重复项。如果该商品已经在商店中,我想用最新的属性更新它。如果它是一个新项目,我想创建它。
导入速度很慢所以我使用了Instruments并看到导入的最长部分是检查项目是否已经存在(带有获取请求)
所以我想知道是否检查项目是否已经在商店中,是否更快:
我认为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;
}
答案 0 :(得分:3)
据我所知,在Implementing Find-or-Create Efficiently中描述了在核心数据中查找和/或导入对象的最佳方式。
该文档描述了基于排序数据的查找或创建模式:从服务下载的数据以及从商店中获取的数据。
我真的建议你阅读我提供的链接。你会看到你的表现加快。
显然你应该在后台完成工作,防止主线程冻结,使用线程限制或新的iOS核心数据队列API。
希望有所帮助。