我正在尝试将数据加载到核心数据的表视图中。但有些值是重复的。因此,在我用于获取数据的数组中,我试图告诉数组删除任何重复项,然后在表视图中显示它。但出于某种原因,它并没有删除重复项。这是代码:
已更新
- (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;
}
谢谢!
答案 0 :(得分: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问题是一个红色的鲱鱼。 “result”数组不包含NSStrings,它包含对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];
答案 1 :(得分: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
}