私は文字列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")
が最終的に表示されますが、私は、オブジェクトへの更新を行うときにのみ!私が何を試しても、最初のフェッチに適用する並べ替えを得ることはできません。
アイデアはありますか?
Mohabitar、カスタムコンパレータではなく標準ソート記述子を使用しようとしましたか?実際にストアにフェッチする際にどのような操作を適用できるかについては、何らかの奇妙な規則が存在するため、これを言います。また、NSFetchRequestだけにテストを分離することをお勧めします。結果コントローラにノイズが追加されます。 IOW、フェッチが動作することを確認してください。そしてそれを表示することを心配してください。 Andrew – adonoho
通常のソート記述子では、すべて正常に動作します。フェッチが実行されています。私の結果は、上記のソート記述子でアルファベット順に取り出されるので、すべてが機能しています。 NSFetchedResultsControllerのない通常のフェッチ要求でこのソート記述子を試してみましたが、うまくいきました。そのNSFetchedResultsControllerは私に問題を与えています。 – Snowman