12

我是 Apple 的 iPhone 3.0 SDK 对 Core Data 支持的新手,我对 iPhone 开发也比较陌生。我的问题是比文档中涵盖的更“复杂”的排序。我怀疑我在做一个不正确的基本假设。

如何按包含在集合中更深几层的属性对预取的托管对象集合进行排序?

示例:Farm 对 Cowboy 有 1 对多 (Farm.cowboys) Cowboy 对 Person 有 1 对 1 (Cowboy.person) Person 有 lastName (Person.lastName)

整个对象图已被获取,牛仔通过 UITableView 显示。现在,如何按姓氏对牛仔进行排序?我需要重新获取它们吗?如果是的话,我如何使用嵌套排序来做到这一点?

目前,我正在尝试对牛仔([Farm.cowboys allobjects])的 NSMutableArray 进行排序,这对于 Cowboy 上的这些属性很好。但是我不确定在按 Cowboy.person.lastName 对 Cowboys 集合进行排序时如何进行这项工作?

4

4 回答 4

21

如果您可以以 10.6 为目标,则可以使用块来完成此操作。像这样:

- (NSArray *)sortedArray {
    return [originalArray sortedArrayUsingComparator:(NSComparator)^(id obj1, id obj2){
    NSString *lastName1 = [[obj1 person] lastName];
    NSString *lastName2 = [[obj2 person] lastName];
    return [lastName1 caseInsensitiveCompare:lastName2]; }];
}
于 2009-09-01T21:49:53.203 回答
5

你可以这样排序:

[myUnsortedArrayOfCowboys sortedArrayUsingDescriptors:
    [NSArray arrayWithObject:
        [NSSortDescriptor
            sortDescriptorWithKey:"person.lastName"
            ascending:YES]]];

注意“。” 在排序描述符键中。这就是您遍历对象图的方式。

于 2011-06-20T03:28:41.577 回答
1

如果要对数字和字符串进行排序,请使用此

NSArray *unsortedArray = [NSArray arrayWithObjects:@"Hello", @"4", @"Hi", @"5", @"2", @"10", @"1", nil];
NSArray *sortedArray = [unsortedArray sortedArrayUsingComparator:^(id firstObject, id secondObject) {
    return [((NSString *)firstObject) compare:((NSString *)secondObject) options:NSNumericSearch];
}];
于 2011-08-17T13:34:12.817 回答
0

希望有人有更好的解决方案。然而....

具有比较选择器和对排序对象的引用的包装器对象有效。它不像我想要的那么干净,所以希望其他人会想出一个替代方案。

本质上 CowboyWrapper 有一个牛仔属性。CowboyWrapper 还有一个比较选择器。通过构建 CowboyWrappers 的 NSMutableArray 并使之保持同步,排序可以工作。

于 2009-09-01T21:30:20.403 回答