3

そのクラスのカテゴリで定義されたブールプロパティで呼び出さNSManagedObjectれました。WorkOrderisComplete

を使用しNSFetchedResultsControllerてこれらをデータストアからフェッチし、テーブルビューに表示します。プロパティに基づいて結果をフィルタリングできるようにしたいのですが、プロパティがCore Data属性ではないため、isCompleteもちろん、の述語ではフィルタリングできません。また、そのプロパティは読み取り専用であるためNSFetchedResultsController、コントローラーの配列をフィルター処理できません。fetchedObjects

NSFetchedResultsController模倣しているが、フェッチ後に結果をフィルタリングできる独自のデータ構造をローリングせずに、私がやろうとしていることを実行する方法はありますか?

4

2 に答える 2

2

Adam Eberbachの回答に対するコメントで述べたように、グループ化された結果を格納するための(、以下)と、辞書のソートされたキーを格納するためのNSDictionary( 、以下)を使用してこれを解決しました。self.workOrdersByDateNSArrayself.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 に答える