我遇到一个问题,当数据发生变化时,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
是否有人遇到此问题或找到了解决方法?
如果我最喜欢所有,然后不喜欢一切,那么排序就会自行解决。这让我相信这可能是一个错误的问题?不幸的是,我也不确定如何解决这个问题。
答案 0 :(得分:2)
仅仅因为该字段代表BOOL
并不意味着它实际上是BOOL
。 favorite
模型中的Thing
字段实际上是NSNumber
,因此, 3 状态,@(YES)
,@(NO)
和nil
。一旦我确定正在初始化favorite
字段,排序就会按预期再次开始工作。