如何根据计算的属性过滤来自 NSFetchedResultsController 的结果?

Posted

技术标签:

【中文标题】如何根据计算的属性过滤来自 NSFetchedResultsController 的结果?【英文标题】:How do I filter results from an NSFetchedResultsController based on a calculated property? 【发布时间】:2012-12-04 22:13:21 【问题描述】:

我有一个名为WorkOrderNSManagedObject,在该类的类别中定义了一个布尔属性isComplete

我使用NSFetchedResultsController 从数据存储中获取这些并在表格视图中显示它们。我希望能够根据isComplete 属性过滤结果,但是NSFetchedResultsController 中的谓词当然不能这样做,因为该属性不是核心数据属性。我也无法过滤控制器的 fetchedObjects 数组,因为该属性是只读的。

有什么方法可以在不滚动我自己的数据结构的情况下做我想做的事情,它模仿NSFetchedResultsController,但允许我在获取后过滤结果?

【问题讨论】:

【参考方案1】:

正如我在 cmets 中为 Adam Eberbach 的回答所说的那样,我使用 NSDictionaryself.workOrdersByDate,下方)存储分组结果以及 NSArrayself.dateSections,下方)解决了这个问题存储字典的排序键。

// Fetch all the WorkOrders
NSArray *results = [WorkOrder findAll];

// Filter based on isComplete property
NSPredicate *filter;
if (self.segmentedStatus.selectedSegmentIndex == SegmentAssigned) 
    filter = [NSPredicate predicateWithFormat:@"isComplete == 0"];
 else 
    filter = [NSPredicate predicateWithFormat:@"isComplete == 1"];

results = [results filteredArrayUsingPredicate:filter];

// Retain an NSArray of sorted NSDate keys
self.dateSections = [[results valueForKeyPath:@"@distinctUnionOfObjects.scheduledStartDate.beginningOfDay"] sortedArrayUsingSelector:@selector(compare:)];

// Create the dictionary
self.workOrdersByDate = [[NSMutableDictionary alloc] initWithCapacity:self.dateSections.count];
for (int sectionNum = 0; sectionNum < self.dateSections.count; sectionNum++) 
    NSPredicate *sectionPredicate = [NSPredicate predicateWithFormat:@"scheduledStartDate.beginningOfDay == %@", [self.dateSections objectAtIndex:sectionNum]];
    NSArray *workOrdersForSection = [results filteredArrayUsingPredicate:sectionPredicate];
    [resultsDict setObject:workOrdersForSection forKey:[self.dateSections objectAtIndex:sectionNum]];

【讨论】:

【参考方案2】:

您从 Core Data 查询中收到一个对象数组,为什么不在该结果上使用 filteredArrayUsingPredicate 来获得您真正想要的数组?

在这种情况下,您可能会放弃使用 NSFetchedResultsController 直接填充您的表格,但当数据更改时,它仍然可以用于其委托通知。

【讨论】:

是的,我可以这样做,但是我失去了您通过 NSFetchedResultsController 免费获得的所有排序和分组。不过,这可能是我最好的选择。 除非布尔值可以添加到 NSManagedObject 我不知道更好的方法。 我最终完全放弃了NSFetchedResultsController 并使用NSDictionary 来实现它,以保留NSFetchedResultsController 给我的分组。我将字典的排序键保留在一个单独的数组中。 @JamieForrest,这听起来像是一个完整的答案......愿意发布它并自我接受吗?我会提出一些观点。

以上是关于如何根据计算的属性过滤来自 NSFetchedResultsController 的结果?的主要内容,如果未能解决你的问题,请参考以下文章

根据来自不同对象数组的属性和值过滤对象数组

根据选择选项值过滤 Vue 列表

Ember.JS - 无法根据计算属性进行过滤或过滤

如何使用 vue/vuex 从输入中过滤数据?

如何根据来自不同列的多个值过滤熊猫表? [复制]

如何根据来自其他 pyspark 数据帧的日期值过滤第二个 pyspark 数据帧?