NSFetchedResultsController仅按第一排序描述符排序

时间:2012-08-12 19:48:31

标签: core-data nsfetchedresultscontroller

我遇到一个问题,当数据发生变化时,NSFetchedResultsController只会按NSSortDescriptor数组中的第一个sortDescriptors进行排序。这真的令人气愤。

我正在使用NSFetchedResultsController来管理显示项列表的tableview。这些项目具有基于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,它只按第一个排序描述符排序,列表如下:

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

是否有人遇到此问题或找到了解决方法?

更新

如果我最喜欢所有,然后不喜欢一切,那么排序就会自行解决。这让我相信这可能是一个错误的问题?不幸的是,我也不确定如何解决这个问题。

1 个答案:

答案 0 :(得分:2)

好吧,我明白了,这是我自己的错。

仅仅因为该字段代表BOOL并不意味着它实际上是BOOLfavorite模型中的Thing字段实际上是NSNumber,因此, 3 状态,@(YES)@(NO)nil。一旦我确定正在初始化favorite字段,排序就会按预期再次开始工作。