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

但是,如果您要取消最喜欢的事物编号 2,它只会按第一个排序描述符排序,列表如下所示:

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

有没有人遇到过这个问题或找到了解决方法?

更新

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

4

1 回答 1

2

好吧,我想通了,这是我自己的错。

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

于 2012-08-13T15:36:10.560 回答