2012-04-11 17 views
3

私は文字列tagNameを持つエンティティTagを持っています。私はこのエンティティのすべてのオブジェクトをNSFetchedResultsControllerにフェッチしようとしましたが、tagNameというタグを最初のオブジェクトにしたいと思います。コアデータの結果をNSFetchedResultsControllerにソート

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ステートメントも表示されません)。私の結果は、ascendingに指定したBOOLの値に基づいてのみ返されます。ブロックは無視されます。

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

アイデアはありますか?

+0

Mohabitar、カスタムコンパレータではなく標準ソート記述子を使用しようとしましたか?実際にストアにフェッチする際にどのような操作を適用できるかについては、何らかの奇妙な規則が存在するため、これを言います。また、NSFetchRequestだけにテストを分離することをお勧めします。結果コントローラにノイズが追加されます。 IOW、フェッチが動作することを確認してください。そしてそれを表示することを心配してください。 Andrew – adonoho

+0

通常のソート記述子では、すべて正常に動作します。フェッチが実行されています。私の結果は、上記のソート記述子でアルファベット順に取り出されるので、すべてが機能しています。 NSFetchedResultsControllerのない通常のフェッチ要求でこのソート記述子を試してみましたが、うまくいきました。そのNSFetchedResultsControllerは私に問題を与えています。 – Snowman

答えて

1

NSFetchRequestに渡す述語がブロック述語である場合、フェッチ要求は失敗します。これは、CoreDataが述部をSQLに変換してデータベースに対して実行できるようにするためです。結果として、述語はフェッチ要求の結果であるオブジェクトと実際に比較されることはありません。

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

上記のルールの面白い例外も説明します。既存のNSFetchedResultsControllerがあり、NSManagedObjectContextにオブジェクトを追加すると、NSPredicateとNSSortDescriptorをSQLに変換するのではなくオブジェクトに対して評価することで、NSFetchedResultsControllerが更新されます。

関連する問題