NSMutableArray的唯一NSMutableDictionaries

时间:2017-01-24 13:19:16

标签: ios objective-c

我从数据库中获取值,并使用以下代码创建包含唯一NSMutableDictionary元素的NSMutableArray

  NSArray *results = [self.managedObjectContext executeFetchRequest:request error:&error];
  NSMutableArray *coreArray = [NSMutableArray new];
  NSLog(@"count %ld",[results count]); //prints 5

    for (NSManagedObjectContext * info in results){
        complianceId = [info valueForKey:@"complianceId"];
        coreDict setValue:[NSNumber numberWithInt:(int)complianceId] forKey:@"comp_id"];
        NSLog(@"inner core dict %@",coreDict); //prints unique elements
        [coreArray addObject:coreDict];
        NSLog(@"array %@",coreArray); //prints an array containing same dictionary elements
    }

结果coreArray由相同的字典元素组成。我可以对此进行排序吗?

3 个答案:

答案 0 :(得分:1)

您只有一个字典coreDict,并且您在每个循环中将相同的字典添加到您的数组中。 每当您为密钥comp_id设置值时,它都会在coreDict的所有实例中更改该值。

相反,你应该在每个循环上创建一个新的字典并将其添加到数组中。

替换:

[coreDict setValue:[NSNumber numberWithInt:(int)complianceId] forKey:@"comp_id"];
[coreArray addObject:coreDict];

使用:

NSDictionary *dict = @{@"comp_id":[NSNumber numberWithInt:(int)complianceId]};
[coreArray addObject:dict];

答案 1 :(得分:0)

请在您的请求中添加NSSortDescriptor和NSPredicate!这将有助于根据键进行排序..

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSPredicate* predicate = nil; // Create your predicate here!!
    if (predicate)
    {
        [request setPredicate:predicate];
    }
    NSString *sortKey = @"complianceId";
    if (sortKey)
    {
        NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:sortKey ascending:NO];
        NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil];
        [request setSortDescriptors:sortDescriptors];
    }
    NSArray *results = [self.managedObjectContext executeFetchRequest:request error:&error];

答案 2 :(得分:0)

在NSFetchRequest上使用以下代码。它会解决你的问题。

fetchRequest.returnsDistinctResults = YES