过滤 NSFetchedResultsController 以删除具有相同名称的对象

Posted

技术标签:

【中文标题】过滤 NSFetchedResultsController 以删除具有相同名称的对象【英文标题】:Filter NSFetchedResultsController to remove objects with same name 【发布时间】:2011-12-14 18:47:49 【问题描述】:

我有这些对象是唯一的,除了两列我用作 UITableView 中的显示。由于这个原因,UITableView 经常会显示重复项。我需要以某种方式过滤掉这些重复项。

在这种情况下,在 FetchResult 上设置 distinctResult 将不起作用,因为这会限制 NSFetchedResultsController 的功能,并且它要求 REsultType 是 NSDictionary 而不是托管对象的子类。

没有人知道如何使用谓词过滤这些重复项吗?请记住,这些对象上的每个字段都是唯一的,除了其中两个。

-(NSFetchedResultsController *) fetchGroupedObjects:(NSString *)entityDescription 
                                      sortField:(NSString *)sortField 
                                     withPredicate:(NSPredicate *)predicate  

BPRAppDelegate *delegate = (BPRAppDelegate *)[UIApplication sharedApplication].delegate;
NSManagedObjectContext *context = delegate.managedObjectContext;
//NSError *error;

//Fetch the data....
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription 
                               entityForName:entityDescription inManagedObjectContext:context];
[fetchRequest setEntity:entity];

NSSortDescriptor *groupDescription = [[NSSortDescriptor alloc]
                                    initWithKey:GROUP_NAME ascending:YES];
//Sort by Category Name
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]
                                    initWithKey:sortField ascending:YES];

NSMutableArray *sorts = [[[NSMutableArray alloc] init] autorelease];

[sorts addObject:sortDescriptor];
[sorts addObject:groupDescription];


[fetchRequest setSortDescriptors:sorts];
//[fetchRequest setResultType:NSDictionaryResultType];
//[fetchRequest setPropertiesToGroupBy:[entity.propertiesByName valueForKey:CONTRACTOR_NAME];


if (predicate != nil)
  [fetchRequest setPredicate:predicate];


//NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];

//NSFetchResultsController

[fetchRequest setFetchBatchSize:20];

NSFetchedResultsController *fetchedResultsController = 
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                                    managedObjectContext:context sectionNameKeyPath:GROUP_NAME 
                                               cacheName:nil]; //Don't use a cache
 [fetchRequest release];
 [sortDescriptor release];
 [groupDescription release];
 return fetchedResultsController; //You can't autorelease this thing... the requestor must  do that.

【问题讨论】:

我很乐意为您提供帮助。但我需要有关您要过滤的实体的更多详细信息。实体叫什么,它有哪些字段 - 哪些是假的? 【参考方案1】:

虽然将可选的一对一关系设置回自身(例如“child”)可能更容易,这样您就可以使用“child == nil”的 NSPredicate 进行获取,但您当然可以进行后过滤在纯目标 C 中使用 [array enumerateObjectsUsingBlock:] 或等效项很容易,并且只根据您的标准将唯一对象添加到结果数组中。

【讨论】:

以上是关于过滤 NSFetchedResultsController 以删除具有相同名称的对象的主要内容,如果未能解决你的问题,请参考以下文章

核心数据保存竞争条件错误

在 Swift 3 中难以配置 NSFetchedResultsController

为啥 beginUpdates/endUpdates 会重置表视图位置以及如何阻止它这样做?

过滤器的原理是啥?

布隆过滤器 - Redis 布隆过滤器,Guava 布隆过滤器 BloomFilter

高效过滤器的检漏过程