3

我有一个在该类的类别中定义的布尔属性的NSManagedObject调用。WorkOrderisComplete

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

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

4

2 回答 2

2

正如我在 Adam Eberbach 回答的评论中所说,我使用NSDictionary( self.workOrdersByDate, 下面) 来存储分组结果,以及NSArray( self.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]];
}
于 2012-12-06T02:27:36.743 回答
1

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

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

于 2012-12-05T02:54:23.180 回答