如何通过对象图对NSMutableArray中的托管对象进行排序

12

我对苹果iPhone 3.0 SDK支持的Core Data很新,并且对iPhone开发相对较新。我的问题是关于比文件中提到的稍微更“复杂”的排序。我怀疑我可能做出了一个不正确的、基本的假设。

如何按照集合中包含的属性深度多层次地排序预获取的托管对象集合?例如:Farm有一个1对多到Cowboy(Farm.cowboys),Cowboy有一个1对1到Person(Cowboy.person),Person有lastName(Person.lastName)。

整个对象图已经被获取并通过UITableView显示了牛仔。那么,我该如何按照lastName对Cowboys进行排序?我需要重新获取它们吗?如果是,如何使用嵌套排序进行操作?

目前,我正在尝试对Cowboys的NSMutableArray进行排序([Farm.cowboys allobjects]),这对于Cowboy上的那些属性来说很好。但是,我不确定如何使其在按Cowboy.person.lastName对一组Cowboys进行排序时起作用。

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]; }];
}

2
值得注意的是,如果你正在使用 NSMutableArray,你可以使用 sortUsingComparator: 来实现相同的功能。 - Matt Ball
你应该移除对NSComparator的转换。 - Psycho

5

您可以这样排序:

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

请注意排序描述符键中的“.”。这是您遍历对象图的方法。

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];
}];

0
希望有人能提供更好的解决方案。然而......
一个带有比较选择器和对排序对象的引用的包装对象是可行的。虽然不够简洁,但希望其他人能想出替代方案。
实质上,CowboyWrapper具有cowboy属性。CowboyWrapper还具有比较选择器。通过构建并保持CowboyWrappers的NSMutableArray同步,排序可以正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接