【问题标题】:How can I use KVC Collection Operators for distinctUnionOfObjects in NSArray of NSDictionaries?如何在 NSDictionaries 的 NSArray 中为 distinctUnionOfObjects 使用 KVC 集合运算符?
【发布时间】:2016-02-18 07:23:58
【问题描述】:

我想从具有值数组的数组字典中获取特定属性的集合。以下是我的数组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"];

但这只会在arrPupilsIdsFromServer 的数组中为我提供PupilIdCollection 的不同对象,而不是在一个数组中包含所有值的数组的一个对象,如下所示:

我想要在 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)

如何做到这一点?

【问题讨论】:

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


    【解决方案1】:

    您需要使用@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
    )
    

    【讨论】:

      【解决方案2】:

      例如,从 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);
      

      【讨论】:

      • 写得很好而且很高效(尽管不需要它——有一个 KVC 集合运算符可以完成这项工作)——但是 enumerateObjectsUsingBlock: 方法在子数组上同时运行,并调用 mutableSet AddObjectsFromArray: from几个线程一次。据我所知 - NSMutableSet 不是线程安全的,您最好将分配同步到集合。
      【解决方案3】:

      Wain 解释得很好。我也觉得单行很难做到。您可以为所有这些元素创建一个数组,然后使用distinctUnionOfObjects

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多