FetchedResults控制器过滤计算值

时间:2013-04-24 20:10:00

标签: ios uitableview core-data nsfetchedresultscontroller

我有一个由NSFetchedResultsController管理的tableview。

我的问题是我正在尝试根据需要查看核心数据实体上的相关值的计算值来过滤数据。

进一步提供上下文:我有一个名为“Task”的核心数据实体,以及一个名为“TaskActions”的多对多关系。

我想通过查看操作并使用一些自定义逻辑来对任务tableview进行排序。

问题在于我真的不知道如何最好地实现这一目标。

以下是我尝试的内容

 NSFetchRequest *requestForAll = [[NSFetchRequest alloc] initWithEntityName:@"Task"];
 NSPredicate *actionPredicate = [NSPredicate predicateWithFormat:@"taskActionPerformed == %@",@YES];
 requestForAll.predicate = actionPredicate;
 [self setFetchedResultsController:[[NSFetchedResultsController alloc] initWithFetchRequest:requestForAll managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:nil]];

我可以通过将属性“taskActionPerformed”放在实体上并覆盖getter值来实现这种“过滤”工作:

 - (NSNumber*)taskActionPerformed
{
    for (TaskActions *action in self.actions)
    {
        //Perform Logic
        return @YES;
    } 
    return @NO;
} 

但是,我已经读过,不鼓励覆盖KVO方法(比如我正在使用吸气剂),甚至不推荐。

此外,上述解决方案仅在我保留数据之前有效。保存数据后,不会调用taskActionPerformed,也不会加载fetchedresultscontroller。

我真的很想知道解决这个一般问题的最佳方法。

1 个答案:

答案 0 :(得分:1)

最佳做法是在内存中进行过滤。

来自Fetching Managed Objects

中的核心数据编程Gude
  

您无法使用基于瞬态属性的谓词进行提取(尽管您可以使用瞬态属性自行在内存中进行过滤)。 ...但是,总而言之,如果直接执行提取,通常不应将基于Objective-C的谓词或排序描述符添加到提取请求中。相反,您应该将这些应用于获取的结果。