3

Tagstring プロパティを持つエンティティがありますtagName。このエンティティ内のすべてのオブジェクトを にフェッチしようとしましたが、「メイン」のNSFetchedResultsControllerタグを最初のオブジェクトにしたいです。tagNameこれが私が今していることです:

 NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription 
                                   entityForName:@"Tag" inManagedObjectContext:appDelegate.managedObjectContext];

[fetchRequest setEntity:entity];

NSSortDescriptor *lastDescriptor2 =
[[[NSSortDescriptor alloc] initWithKey:@"tagName" ascending:NO comparator:^NSComparisonResult(NSString* tag1, NSString* tag2) {
    NSLog(@"compare");
    if ([tag1 isEqualToString:@"main"]) return NSOrderedAscending;
    if ([tag2 isEqualToString:@"main"]) return NSOrderedDescending;
    return [tag1 compare:tag2];
}] autorelease];  

[fetchRequest setSortDescriptors:[NSArray arrayWithObject:lastDescriptor2]];
NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:appDelegate.managedObjectContext sectionNameKeyPath:nil cacheName:nil];
self.fetchedResultsController = theFetchedResultsController;
self.fetchedResultsController.delegate=self;   

if (![[self fetchedResultsController] performFetch:&error]) {
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}

このコードは私のviewDidLoadメソッドで呼び出され、一度だけ呼び出されます。初めて呼び出されると、何らかの理由で、ここの sortDescriptor が適用されません。呼び出されないだけです (NSLogステートメントも表示されません)。BOOL指定した値のみに基づいて結果が返されますascending- ブロックは無視されます。

しかし、新しいTagオブジェクトをに挿入しMOCNSFetchedResultsController更新デリゲート メソッドが呼び出されると、実際の sortDescriptor が適用され、NSLog(@"compare")最後に が表示されますが、それはオブジェクトを更新した場合のみです! 何を試しても、並べ替えを最初のフェッチに適用できません。

アイデアはありますか?

4

1 に答える 1

1

おそらく何度か目にしたことがあると思いますが、NSFetchRequest に渡す述語がブロック述語である場合、フェッチ リクエストは失敗します。これは、CoreData が述語を SQL に変換して、データベースに対して実行できるようにする必要があるために発生します。その結果、述語は、フェッチ要求の結果として生じるオブジェクトと実際に比較されることはありません。

同じことがソート記述子にも当てはまります。フェッチ要求は、フェッチが実行されるときにオブジェクトに対する比較を実行しません。SQL の一部として渡されます。

また、私が上で説明した規則に対する興味深い例外についても説明しています。既存の NSFetchedResultsController があり、オブジェクトを NSManagedObjectContext に追加すると、NSFetchedResultsController は、それらを SQL に変換するのではなく、オブジェクトに対して NSPredicate および NSSortDescriptor を評価することによって更新されます。

于 2013-10-20T05:39:49.423 に答える