1

我正在尝试将数组从核心数据加载到表视图中。有些值是重复的。因此,在我用来获取数据的数组中,我试图告诉数组删除所有重复项,然后将其显示在表格视图中。但由于某种原因,它没有删除重复项。这是代码:

更新

- (void)viewDidLoad
{
    fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *weightEntity = [NSEntityDescription entityForName:@"Tracking" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:weightEntity];
    result = [self.managedObjectContext executeFetchRequest:fetchRequest error:nil];

    NSMutableArray *cleaningArray= [NSMutableArray new];
    NSSet *duplicatesRemover = [NSSet setWithArray:result];
    [duplicatesRemover enumerateObjectsUsingBlock: ^(id obj, BOOL* stop)
    {
        if(![cleaningArray containsObject: obj])
        {
            [cleaningArray addObject: obj];
        }
    }];

    cleanArray = [cleaningArray copy];

    [super viewDidLoad];

    // Do any additional setup after loading the view.
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{    
    static NSString *CellIdentifier = @"Cell";

    mainCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (mainCell == nil) {
        mainCell = [[dictionaryTableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    Entity *person = [cleanArray objectAtIndex:indexPath.row];
    mainCell.nameLabel.text = person.date;

    return mainCell;

}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    NSLog(@"%@", [cleanArray objectAtIndex:0]);
    return   cleanArray.count;
}

谢谢!

4

2 回答 2

2

-containsObject 比较字符串(如 [string1 isEqual:string2])所以你可以这样做

NSArray* result = @[@"test",@"string",@"test",@"line"];
    NSMutableArray* cleanArray = [[NSMutableArray alloc] init];


   for (id object in result) {
        if (![cleanArray containsObject:object])
            [cleanArray addObject:object];
    }

NSLog (@"cleanArray %@",cleanArray);

日志:

cleanArray (
    test,
    string,
    line
)

更新
@dreamlax,我一直在和@Zack 聊天。似乎 NSSet / isEqual 问题是一个红鲱鱼。“结果”数组不包含 NSString,它包含对 Core Data 的获取请求,每个请求当然都是唯一的,即使返回的数据不是。该数组与表视图紧密耦合,表视图根据请求执行这些获取请求。

所以 Zack 需要做的就是将 Core Data 从他的 Table View 中分离出来,预先获取他想要比较的唯一性字符串,并将这个唯一的数组提供给 Table View。NSSet 可以很好地获得一组独特的结果。

fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *weightEntity = 
        [NSEntityDescription entityForName:@"Entity" 
                                 inManagedObjectContext:self.managedObjectContext]; 
[fetchRequest setEntity:weightEntity]; 
result = [self.managedObjectContext executeFetchRequest:fetchRequest 
                                                      error:nil]; 
NSMutableSet *dateSet = [NSMutableSet alloc] init]; 

for (id object in result) { 
    Entity *person = object; 
    NSString* dateString = person.date; 
    [dateSet addObject:dateString]; 
} 

self.dateArray = [dateSet allObjects]; 

然后在他的tableView中:

mainCell.nameLabel.text = [cleanArray objectAtIndex:indexPath.row];

于 2013-01-10T01:50:37.113 回答
1

归功于 dreamlax,这是覆盖 isEqual: 方法的问题,这就是为什么NSSet不删除重复对象的原因。

在您的实体中,覆盖 isEqual 方法并在所有字段相等时返回 true,例如:

- (BOOL)isEqual:(id)anObject
{
    return self.attribute_1 == anObject,attribute_1 && ... && self.attribute_N== anObject.attribute_N; // Primitive types comparison in this example
}
于 2013-01-10T02:23:56.810 回答