对包含集合的集合的NSPredicate查询(KVC)

时间:2013-03-05 19:37:37

标签: ios collections nspredicate kvc

编辑(我错过了一层细节):每位老师都有一系列课程。 (我也通过验证器运行JSON,所以它更容易阅读) 假设以下JSON:

{
"schools": [
    {
        "schoolID": "01",
        "schoolName": "School01",
        "teachers": [
            {
                "name": "Mr. Russell",
                "teacherID": "teach01",
                "classes": [
                    {
                        "className": "History",
                        "classID": "class01"
                    },
                    {
                        "className": "Civics",
                        "classID": "class02"
                    }
                ]
            },
            {
                "name": "Mrs. Pearl",
                "teacherID": "teach02",
                "classes": [
                    {
                        "className": "English",
                        "classID": "class05"
                    },
                    {
                        "className": "Poetry",
                        "classID": "class06"
                    }
                ]
            }
        ]
    },
    {
        "schoolID": "02",
        "schoolName": "School01",
        "teachers": [
            {
                "name": "Mr. Russell",
                "teacherID": "teach05",
                "classes": [
                    {
                        "className": "Pre-Calc",
                        "classID": "class10"
                    },
                    {
                        "className": "Calculus",
                        "classID": "class12"
                    }
                ]
            },
            {
                "name": "Mr. Marks",
                "teacherID": "teach07",
                "classes": [
                    {
                        "className": "History",
                        "classID": "class01"
                    },
                    {
                        "className": "Driving",
                        "classID": "class20"
                    }
                ]
            }
        ]
    }
]
}

即,我有一系列学校,每所学校都有一系列教师,每个教师都有一系列课程。 (对不起,如果JSON的确切格式不太正确;这是一个理论模型,因为我不能透露真实的,因为NDA要求。实际的模型是合理的。)

我需要使用NSPredicate&amp ;;对此集合进行搜索。 KVC,并获取所有名为“历史”的classNames。我试图用几种不同的方式执行它,但是我的空洞。例如:

NSPredicate *pred = [NSPredicate predicateWithFormat:@"ANY schools.teachers.classes.className == %@", @"History"];

但我回来了。对于KVC可以执行什么,我试图过于复杂?在我可以搜索classNames之前,我是否需要遍历每个学校并然后遍历每个教师?或者,如果我想做什么是可能的,我缺少什么?

感谢。

1 个答案:

答案 0 :(得分:0)

我假设是

  

我需要[...]获取所有名为“History”的classNames。

您的意思是获取与给定名称匹配的实际类词典。

我认为你的JSON字典对于KVC来说可能过于复杂,但只是在字典中的对象同时包含字典和数组的意义上,所以简单的谓词只是通过使用键来匹配。

我能够找回一个名为“History”的类数组。我能够通过首先创建一个类数组然后对这些类进行过滤来实现这一目标。

NSDictionary *schoolsDictionary = ...
NSArray *schoolsArray = @[schoolsDictionary];

NSArray *classesArray = [schoolsArray valueForKeyPath:@"@unionOfArrays.schools.@unionOfArrays.teachers.@unionOfArrays.classes"];
NSArray *filteredClasses = [classesArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"className = %@", @"History"]];

这种情况下的结果是

(
{
    classID = class01;
    className = History;
},
{
    classID = class01;
    className = History;
}
)