Core data NSFetchedResultsController仅按第一个排序描述符排序

Core data NSFetchedResultsController仅按第一个排序描述符排序,core-data,nsfetchedresultscontroller,Core Data,Nsfetchedresultscontroller,我发现一个问题,当数据更改时,NSFetchedResultsController只按sortDescriptors数组中的第一个NSSortDescriptor排序。真让人气愤 我正在使用NSFetchedResultsController来管理显示项目列表的tableview。这些项目具有基于number属性的固有顺序,但用户可以喜欢某个项目。收藏夹项显示在表视图的顶部,按编号属性排序 因此,模型看起来像这样: @接口事物:NSManagedObject @属性(非原子,保留)NSNumbe

我发现一个问题,当数据更改时,NSFetchedResultsController只按
sortDescriptors
数组中的第一个
NSSortDescriptor
排序。真让人气愤

我正在使用NSFetchedResultsController来管理显示项目列表的tableview。这些项目具有基于
number
属性的固有顺序,但用户可以喜欢某个项目。收藏夹项显示在表视图的顶部,按
编号
属性排序

因此,模型看起来像这样:

@接口事物:NSManagedObject
@属性(非原子,保留)NSNumber*编号;
@属性(非原子,保留)NSNumber*收藏夹;
@结束
@实施事项
@动态数;
@动态收藏;
@结束
我正在配置我的
NSFetchedResultsController
,如下所示:

-(无效)加载视图{
...
//
//为things表视图配置获取结果控制器
NSFetchRequest*fetchThings=[[NSFetchRequest alloc]init];
fetchChannels.entity=[NSEntityDescription entityForName:NSStringFromClass([Thing class])
inManagedObjectContext:[DataManager sharedInstance].managedObjectContext];
fetchThings.sortDescriptors=@[
[NSSortDescriptor SortDescriptor With Key:@“收藏夹”升序:否],
[NSSortDescriptor SortDescriptor With key:@“number”升序:是];
_fetchController=[[NSFetchedResultsController alloc]initWithFetchRequest:fetchThings
managedObjectContext:[DataManager sharedInstance]。managedObjectContext
sectionNameKeyPath:无
cacheName:nil];
n错误*错误=nil;
如果(![\u fetchController performFetch:&错误]){
NSLog(@“执行获取时出错!%@”,错误.localizedDescription);
}
}
最初加载表时,
\u fetchController
会正确地对项目进行排序,因此您可能会得到如下结果:

-Thing:favorite=YES,number=2
-事物:最爱=是,数字=3
-事物:最爱=否,数字=1
-事物:最爱=否,数字=4
但是,如果您要取消最喜欢的东西2,它只按第一个排序描述符排序,列表如下所示:

-Thing:favorite=YES,number=3
-事物:最爱=否,数字=2
-事物:最爱=否,数字=1
-事物:最爱=否,数字=4
有没有人遇到过这个问题或找到了解决办法

更新
看起来,如果我喜欢所有的东西,那么不喜欢所有的东西,排序就会自动完成。这让我相信这可能是一个错误的问题?不幸的是,我也不知道如何解决这个问题。

好的,我想出来了,这是我自己的错


仅仅因为该字段表示一个
BOOL
,并不意味着它实际上是一个
BOOL
Thing
模型中的
收藏夹
字段实际上是一个
NSNumber
,因此,它有3个状态,
@(YES)
@(NO)
,和
nil
。一旦我确定我正确初始化了
收藏夹
字段,排序又开始按预期工作了。

你完全正确。我在排序方面也遇到了同样的问题,并且还指出,NSNumber中的bool值可以有3个状态YES、NO和nil。