如何使子对象搜索更简洁?

时间:2011-06-24 16:36:47

标签: iphone objective-c nspredicate

我感兴趣的是一种简洁方法来查找需要子对象级别的数组中的匹配项。性能不一定接近理想,但应该是合理的。

对于本案例,我不想添加反向关系或管理保留的词典。我根本不想改变模型。

Object1包含Object2,Object2包含Object3。我知道以下方法将返回第一个匹配,但是返回每个匹配的解决方案也是可以接受的。

-(Object1*)getObject1ForObject3:(Object3*)object3
{
    for(Object1 *object1 in self.object1s)
        if(object1.object2.object3 == object3)
            return  object1 ;

    return nil ;
}

对于声望,如果中间有多对多的关系,我们可以简化吗?

-(Object1*)getObject1ForObject3:(Object3*)object3
{
    for(Object1 *object1 in self.object1s)
        for(Object2 *object2 in object1.object2s)
            if(object2.object3 == object3)
                return  object1 ;

    return nil ;
}

1 个答案:

答案 0 :(得分:3)

嗯,声明NSPredicate的API并不完全是 terse ,但它仍然可能比你正在做的更简洁。

对于第一种情况,中间没有多对多:

NSPredicate *pred = [NSPredicate predicateWithFormat:@"object2.object3 == %@", object3];
NSArray *matchingObj1s = [self.object1s filteredArrayUsingPredicate];

当中间存在多对多的关系时:

NSPredicate *pred = [NSPredicate predicateWithFormat:@"ANY object2s.object3 == %@", object3];
NSArray *matchingObj1s = [self.object1s filteredArrayUsingPredicate];