是否有更快的方法来检索核心数据中的特定托管对象而不是获取请求?

时间:2013-12-19 19:31:01

标签: ios objective-c core-data nsmanagedobject nsfetchrequest

我有一个方法来创建每个具有三个属性的托管对象(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映射到字典是获取关联对象的最简单,最快捷的方法。

2 个答案:

答案 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;

}