2012-01-27 63 views
2

我有一个NSFetchRequest从核心数据获取对象并使用一个微不足道的NSSortDescriptor对它们进行排序。我用一对夫妇取决于用户选择什么样不同的人,但他们是这样的:NSSortDescriptor - 订单是否已更改?

NSMutableArray *sortDescriptors = [NSMutableArray array]; 
    NSSortDescriptor *sortDescriptor1 = [NSSortDescriptor sortDescriptorWithKey:@"ownerName" ascending:YES selector:@selector(caseInsensitiveCompare:)]; 
    NSSortDescriptor *sortDescriptor2 = [NSSortDescriptor sortDescriptorWithKey:@"petName" ascending:YES selector:@selector(caseInsensitiveCompare:)]; 
    [sortDescriptors addObject:sortDescriptor1]; 
    [sortDescriptors addObject:sortDescriptor2]; 
    [fetchRequest setSortDescriptors:sortDescriptors]; 

一切正常上的iOS5和5.1一如预期,但是当我测试在iPad上运行iOS4的完全相同的代码。 2.1(或4.3模拟器),所有第一个排序描述符的顺序相反。在这个例子中,所有者姓名是从Z到A的顺序,但宠物正确订购A到Z!

早期iOS版本中是否存在导致ascending布尔值错误的错误?另外,还有什么我可能做错了吗?

编辑:第一个键(ownerName)用作NSFetchedResultsController部分。不确定这是否相关。

感谢克雷格

+0

如果您为'ascending'参数传递'NO',您会得到正确的顺序吗? – Mundi 2012-01-27 22:57:36

+0

是的。我已经将第一个SD上的'升序'字符更改为NO,然后反映了iOS5的结果。第二个SD仍然设置为YES,并且该部分中的项目以相同的方式排序。奇怪的! – 2012-01-28 00:20:44

回答

0

只是猜测。

我有很好的结果,没有指定caseInsensitiveCompare:

此外,严格来说NSFetchRequest预计NSArray作为sortDescriptors参数,而不是NSMutableArray。在所有苹果的示例代码它通常是像这样的

[fetchRequest setSortDescriptors: 
    [NSArray arrayWithObjects:sortDescriptor1, sortDescriptor2, nil]]; 

我有错误(使用可变的,而不是一成不变的),但往往也只是工程。也许改变这是值得一试的。

+0

谢谢!我试着删除'caseInsensitiveCompare',但没有什么不同。我会尝试将可变数组改为数组,明天看看它是否有任何区别。 – 2012-01-28 00:27:34

+0

我可以确认这没什么区别:( – 2012-01-31 22:46:49

+0

关于'NSMutableArray'与'NSArray',因为'NSMutableArray'是'NSArray'的一个子类,那么当它通过时它会自动被强制转换,所以这不会导致你任何问题在一个理智的面向对象系统中,每个子类都应该能够支持它的超类。 – 2014-03-17 05:20:26