我看到 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
有没有人遇到过这个问题或找到了解决方法?
更新
看来,如果我喜欢所有内容,然后不喜欢所有内容,排序就会自行解决。这让我相信这可能是一个错误的问题?不幸的是,我也不确定如何解决这个问题。