排序描述符中的函数

时间:2011-05-21 02:21:35

标签: objective-c nssortdescriptor

在我的核心数据模型中,我有一个人物实体,其属性为firstName和lastName。当我使用带有fetchedResultsController的排序描述符时,我按firstName排序。但是如果firstName是nil,我想改用lastName。

我也有人和物之间的关系,称为personOfObjects,其中person< - >>对象。我正在排序以呈现在UITableView中。它的工作正常,除了名字为零的情况。在这种情况下,当这些特殊情况真的应该按姓氏排序时,它们都会被分组到同一个组中。

以下是我现在所做的事情:

NSEntityDescription * entity = [NSEntityDescription entityForName:@"object" inManagedObjectContext:dataInterface.managedObjectContext];

[fetchRequest setEntity:entity];

NSSortDescriptor *personSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"personOfObject.firstName" ascending:YES];
NSSortDescriptor *objectSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"objectDescription" ascending:YES];

NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:personSortDescriptor, objectSortDescriptor, nil];

我以为我可以在person类中创建一个辅助函数,如下所示:

- (NSString *) firstLast {
    if (![self.firstName isNullString] ) return self.firstName;
    if (![self.lastName isNullString] ) return self.lastName;
    return @"";
}

然后更改第一个排序描述符以引用此函数:

NSSortDescriptor *personSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"personOfObject.firstLast" ascending:YES];
NSSortDescriptor *objectSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"objectDescription" ascending:YES];

NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:personSortDescriptor, objectSortDescriptor, nil];

我真的没想到这会起作用(但事实并非如此),但我想知道是否有一种直截了当的方式来做这样的事情。

1 个答案:

答案 0 :(得分:2)

您可以使用自己的NSComparator(How to use NSComparator?

来完成此操作

这个问题也有一些代码:

How to Sort an NSMutableArray of Managed Objects through an object graph

您必须在比较器中添加条件比较,而不是链接排序描述符。