我有一个方法来创建每个具有三个属性的托管对象(IntersectionObject)。这三个属性本身就是托管对象。
PropertyObject1,PropertyObject2和PropertyObject3各有大约20种不同的可能性。
IntersectionObject本质上是特定PropertyObject1,PropertyObject2和PropertyObject3的组合。
大约有1200个IntersectionObjects并创建它们我使用获取请求来检索和设置正确的PropertyObject:
- (PropertyObject1 *)fetchedPropertyObject1FromID: (NSNumber *)propertyObjectID {
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"PropertyObject1" inManagedObjectContext:[self managedObjectContext]];
[fetchRequest setEntity:entity];
NSError *error = nil;
NSArray *fetchedObjects = [[self managedObjectContext] executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {
NSLog(@"error fetching PropertyObject from ID, error:%@", error);
return nil;
}
for (PropertyObject1 *object in fetchedObjects) {
if (object.propertyObjectID.longValue == propertyObjectID.longValue) {
return object;
}
}
return nil;
}
我发现对1200个IntersectionObjects中的每一个重复这次提取需要大约2秒,并且太慢了。有更快的方法吗?
编辑:接受的答案有我在下面的评论中使用的解决方案。事实证明,简单地将PropertyObjects映射到字典是获取关联对象的最简单,最快捷的方法。
答案 0 :(得分:1)
如果您拥有托管对象ID,请在MOC上使用objectWithID:
。
如果不这样做,并且您将在很短的时间内创建大量关联,请批量从MOC中获取所有托管对象(每批可能有100个项目,请参阅{{1在fetchBatchSize
)上,创建一个将NSFetchRequest
映射到托管对象的字典,这样您就可以进行本地查找。在使用objectID
处理批处理时,将每个对象变回故障。
答案 1 :(得分:0)
使用谓词执行此操作,同时将获取限制设置为1.这应该以更优化的方式获得结果:
- (PropertyObject1 *)fetchedPropertyObject1FromID: (NSNumber *)objectID {
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"PropertyObject1" inManagedObjectContext:[self managedObjectContext]];
[fetchRequest setEntity:entity];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"objectID == %@", objectID]];
[fetchRequest setFetchLimit:1];
NSError *error = nil;
NSArray *fetchedObjects = [[self managedObjectContext] executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {
NSLog(@"error fetching PropertyObject from ID, error:%@", error);
return nil;
}
if(fetchedObjects.count > 0)
{
[return fetchedObjects objectAtIndex:0];
}
return nil;
}