使用 NSSortDescriptor 对 NSOrderedSet 进行排序

Posted

技术标签:

【中文标题】使用 NSSortDescriptor 对 NSOrderedSet 进行排序【英文标题】:Sorting NSOrderedSet using NSSortDescriptor 【发布时间】:2012-02-09 23:35:59 【问题描述】:

执行此代码时:

NSSortDescriptor *sortDescriptor = [Characteristic sortDescriptor];
[workingSet sortUsingComparator:[sortDescriptor comparator]];

我收到此错误:

*** -[NSMutableOrderedSet sortUsingComparator:]: comparator cannot be nil

sortDescriptor 不为零,所以我不知道为什么这不起作用。

我可以用下面的代码解决这个问题,效果很好:

NSSortDescriptor *sortDescriptor = [Characteristic sortDescriptor];
NSArray *workingArray = [[workingSet array] sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
workingSet = [NSMutableOrderedSet orderedSetWithArray:workingArray];

【问题讨论】:

【参考方案1】:

查看NSArray 参考,了解这两种方法的区别

第一种方法的典型用法是这样的

NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id obj1, id obj2) 

    if ([obj1 integerValue] > [obj2 integerValue]) 
        return (NSComparisonResult)NSOrderedDescending;
    

    if ([obj1 integerValue] < [obj2 integerValue]) 
        return (NSComparisonResult)NSOrderedAscending;
    
    return (NSComparisonResult)NSOrderedSame;
];

(来自Apple 的示例)

第二种方法更像是:

NSSortDescriptor *nameSort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:nameSort];

NSArray *sortedArray = [array sortedArrayUsingDescriptors:sortDescriptors];

【讨论】:

那么为什么 NSSortDescriptor 的 -comparator 方法不能生成一个与 -sortedArrayUsingComparator:-sortUsingComparator: 一起使用的比较器? 虽然你的 sortDescriptor 是 != nil 我猜 -comparator 正在返回 nil。从文档中不是很清楚,但看起来它只返回一个比较器,如果你创建了一个描述符,例如使用sortDescriptorWithKey:ascending:comparator: 呃。这就说得通了。但是啊。

以上是关于使用 NSSortDescriptor 对 NSOrderedSet 进行排序的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSSortDescriptor 对 NSNumber 进行排序

iPhone:无法对多对关系进行 NSSortDescriptor。如何排序?

使用 NSSortDescriptor 对一对多关系的 NSSet 类型的数据进行排序

NSSortDescriptor 按核心数据对多关系中的项目数排序

NSSortDescriptor 没有对我的 NSMutableArray 进行排序?

使用 NSSortDescriptor、Core Data 和 NSFetchedResultsController 按日期和名称对 UITableView 进行排序