2012-12-04 62 views
3

我有一個NSManagedObject調用WorkOrder與布爾屬性isComplete定義在該類別的類別。如何從基於計算屬性的NSFetchedResultsController過濾結果?

我使用NSFetchedResultsController從數據存儲中獲取這些數據並將它們顯示在表格視圖中。我希望能夠根據isComplete屬性篩選結果,但當然NSFetchedResultsController中的謂詞不能這樣做,因爲該屬性不是Core Data屬性。我也無法過濾控制器的fetchedObjects數組,因爲該屬性是隻讀的。

有沒有什麼辦法可以做我想要做的事情,而不用滾動我自己的模擬NSFetchedResultsController的數據結構,但允許我過濾取回後的結果?

回答

2

正如我在亞當埃伯巴赫的答案的評論說,我解決了這個使用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]]; 
} 
1

您會收到核心數據查詢中的對象數組,爲什麼不使用該結果的filteredArrayUsingPredicate來獲取您真正想要的數組?

在這種情況下,您可能會放棄使用NSFetchedResultsController來直接填充表格,但在數據更改時它仍然對委託通知有用。

+0

正確的我可以做到這一點,但後來我失去了所有使用NSFetchedResultsController免費獲得的排序和分組。儘管如此,這可能是我的最佳選擇。 –

+0

除非該布爾值可以添加到NSManagedObject我不知道更好的方法。 –

+1

我最終完全拋棄了'NSFetchedResultsController',並使用'NSDictionary'實現這個以保留NSFetchedResultsController給我的分組。我將字典的已排序鍵保存在單獨的數組中。 –