0

データが変更されたときに、NSFetchedResultsControllerが配列の最初の並べ替えのみを行うという問題が発生してNSSortDescriptorいます。sortDescriptors本当に腹立たしいです。

NSFetchedResultsControllerを使用して、アイテムのリストを表示しているテーブルビューを管理しています。これらのアイテムにはプロパティに基づく固有の順序numberがありますが、ユーザーはアイテムをお気に入りに追加できます。お気に入りのアイテムは、numberプロパティで並べ替えられて、テーブルビューの上部に表示されます。

したがって、モデルは次のようになります。

@interface Thing : NSManagedObject
    @property (nonatomic, retain) NSNumber *number;
    @property (nonatomic, retain) NSNumber *favorite;
@end

@implementation Thing
    @dynamic number;
    @dynamic favorite;
@end

そして、私は私のNSFetchedResultsControllerように構成しています:

- (void)loadView {
    ...
    //
    // configure fetched results controller for the things table view
    NSFetchRequest *fetchThings = [[NSFetchRequest alloc] init];
    fetchChannels.entity = [NSEntityDescription entityForName:NSStringFromClass([Thing class]) 
                                       inManagedObjectContext:[DataManager sharedInstance].managedObjectContext];
    fetchThings.sortDescriptors = @[
    [NSSortDescriptor sortDescriptorWithKey:@"favorite" ascending:NO],
    [NSSortDescriptor sortDescriptorWithKey:@"number" ascending:YES] ];
    
    _fetchController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchThings
                                                           managedObjectContext:[DataManager sharedInstance].managedObjectContext
                                                             sectionNameKeyPath:nil
                                                                      cacheName:nil];
    
    NSError *error = nil;
    if (![_fetchController performFetch:&error]) {
        NSLog(@"error performing fetch! %@", error.localizedDescription);
    }
}

テーブルが最初にロードされるときに_fetchController、アイテムが正しくソートされるため、次のようになります。

- Thing: favorite = YES, number = 2
- Thing: favorite = YES, number = 3
- Thing: favorite = NO, number = 1
- Thing: favorite = NO, number = 4

ただし、Thing Number 2のお気に入りを解除すると、1番目の並べ替え記述子でのみ並べ替えられ、リストは次のようになります。

- Thing: favorite = YES, number = 3
- Thing: favorite = NO, number = 2
- Thing: favorite = NO, number = 1
- Thing: favorite = NO, number = 4

誰かがこの問題に遭遇したか、それに対する回避策を見つけましたか?

アップデート

私がすべてを好きで、次にすべてを嫌うと、ソートはうまくいくように見えます。これは、これが障害のある問題である可能性があると私に信じさせますか?残念ながら、それを回避する方法もわかりません。

4

1 に答える 1

2

OK、私はそれを理解しました、そしてそれは私自身のせいです。

フィールドがを表すからといって、BOOLそれが実際にであるとは限りませんBOOL。モデルのfavoriteフィールドThingは実際にはNSNumberであり、そのため、、、、およびの3つの状態が@(YES)あり@(NO)ますnil。フィールドを適切に初期化していることを確認するとfavorite、ソートが再び期待どおりに機能し始めました。

于 2012-08-13T15:36:10.560 に答える