如何在NSDuraries的NSArray中为distinctUnionOfObjects使用KVC Collection Operators?

时间:2016-02-18 07:23:59

标签: ios objective-c nsdictionary distinct-values kvc

我想从具有值数组的数组字典中获取特定属性的集合。以下是我的数组NSDictionaries

NSArray *arrGroupsFromServer= @[
    @{@"Id": @"7d1021ba-e9be-40c1-a0a1-ad2a2d185b74",@"Name": @"1",@"modifiedDate": @"2016-01-29T15:39:57.000Z",@"PupilIdCollection":@[@"1",@"2"]},
    @{@"Id": @"4d830b79-f447-4ad7-8de1-063acf3e242c",@"Name": @"2 TEST",@"modifiedDate": @"2016-01-29T15:39:57.000Z",@"PupilIdCollection":@[@"1",@"3"]},
    @{@"Id": @"e481987d-fde8-4a6b-8e05-73877065236d",@"Name": @"CQ",@"modifiedDate": @"2016-01-29T15:39:57.000Z",@"PupilIdCollection":@[@"1",@"4"]},
    @{@"Id": @"1a44989d-8b3f-4d8e-8c74-a09c893ca02d",@"Name": @"Intervention group Number",@"modifiedDate": @"2016-01-29T15:39:57.000Z",@"PupilIdCollection":@[@"1",@"5"]},
    @{@"Id": @"f10f2fe0-b575-450d-ad63-10d0e8fbe097",@"Name": @"EYFS Caterpillars",@"modifiedDate": @"2016-01-29T15:39:57.000Z",@"PupilIdCollection":@[@"1",@"6"]},
    @{@"Id": @"232168c1-73a4-4bbb-b9a2-58e6765e4b2c",@"Name": @"Guided Reading group",@"modifiedDate": @"2016-01-29T15:39:57.000Z",@"PupilIdCollection":@[@"1",@"6"]},
    @{@"Id": @"1e9b66f7-c4a7-4774-b062-ce23f587a319",@"Name": @"HfL",@"modifiedDate": @"2016-01-29T15:39:57.000Z",@"PupilIdCollection":@[@"1",@"7"]},
    @{@"Id": @"62d53fc5-1fbf-4ebe-bc52-d07ec2680c66",@"Name": @"Red Intervention group",@"modifiedDate": @"2016-01-29T15:39:57.000Z",@"PupilIdCollection":@[@"1",@"8"]},
    @{@"Id": @"a70e7429-996a-46ff-aff7-1e1bc5e17c3b",@"Name": @"SEN Green group",@"modifiedDate": @"2016-01-29T15:39:57.000Z",@"PupilIdCollection":@[@"1",@"9"]},
    @{@"Id": @"44441c6f-843b-4933-9191-1f3afb23b6cf",@"Name": @"STAT",@"modifiedDate": @"2016-01-29T15:39:57.000Z",@"PupilIdCollection":@[@"1",@"2"]},
    @{@"Id": @"04aedc28-4706-49a1-8bbd-9d58179cfd55",@"Name": @"TIST",@"modifiedDate": @"2016-01-29T15:39:57.000Z",@"PupilIdCollection":@[@"1",@"2"]},
    @{@"Id": @"c98f592e-4adc-4d9d-a484-ae5b417f11db",@"Name": @"Year 8",@"modifiedDate": @"2016-01-29T15:39:57.000Z",@"PupilIdCollection":@[@"1",@"2"]}
];

现在我想将PupilIdCollection属性收集到一个包含所有值的DistintctUnion的单个数组中,如下所示:

NSArray * PupilIdCollection=@[@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9"];(e.g. Order doesn't matter)

我尝试过以下方式:

NSArray *arrPupilsIdsFromServer = [arrGroupsFromServer valueForKeyPath:@"@distinctUnionOfObjects.PupilIdCollection"];

但是这只给了我PupilIdCollection数组中arrPupilsIdsFromServer的不同对象而不是一个对象,其中一个数组中的所有值的数组如下:

Screenshot

我想在KVC的一行代码中使用以下内容:

NSArray * PupilIdCollection=PupilIdCollection=@[@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9"];(e.g. Order doesn't matter);(e.g. Order doesn't matter)

怎么做?

4 个答案:

答案 0 :(得分:2)

您需要使用@distinctUnionOfArrays而不是@distinctUnionOfObjects。此运算符有助于展平集合的层次结构,并合并子数组。有关详细信息,请参见开发人员文档。

例如,这些行(用于您的NSArray)

NSArray *arrPupilsIdsFromServer = [arrGroupsFromServer valueForKeyPath:@"@distinctUnionOfArrays.PupilIdCollection"];
NSLog(@"\nPupil Ids From Server:%@", arrPupilsIdsFromServer);

获得此输出:

Pupil Ids From Server:(
1,
2,
3,
4,
5,
6,
7,
8,
9
)

答案 1 :(得分:0)

您可能需要它,但这并不意味着KVC可以做到这一点 - KVC尊重数据类型并且不会为您展平结构。您需要编写自己的flatten方法,以便传递数组数组并返回单个数组。

使用KVC收集操作员可能无法帮助您,因为您需要迭代并将所有数组内容添加到一组以获得所需的最终结果,这样您也可以使用正常的KVC和避免数组重复处理(除非你知道会有大量的重复数组)。

答案 2 :(得分:0)

来自wain的回答,你可以在获得PupilIdCollection的值之后做到这一点,

 NSArray *pupilIdCollection = [arrGroupsFromServer valueForKeyPath:@"PupilIdCollection"];
__block  NSMutableSet *mutableSet = [[NSMutableSet alloc] init];
 [pupilIdCollection enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
    [mutableSet addObjectsFromArray:obj];
 }];
 pupilIdCollection = [mutableSet allObjects];
 NSLog(@"all objects-%@",pupilIdCollection);

答案 3 :(得分:0)

Wain 已经很好地解释了这一点。我也觉得在一条线上很难实现。您可以为所有这些元素创建单个数组,然后使用distinctUnionOfObjects

NSMutableArray *singleArray =[NSMutableArray array];
for (NSDictionary *d in arrGroupsFromServer) {
    [singleArray addObjectsFromArray:[d objectForKey:@"PupilIdCollection"]];
}
NSArray *pupilIdCollection = [singleArray valueForKeyPath:@"@distinctUnionOfObjects.self"];