对包含多个对象类的NSArray进行排序

时间:2014-07-15 04:09:38

标签: ios objective-c nsarray nsfetchedresultscontroller

我正在使用两种类型的实体:Person对象和Department对象。 Person对象具有属性姓氏,名字,部门名称和电话号码。 Department对象具有属性部门名称和电话号码。

我可以使用NSFetchedResultsControllers来检索Person和Department对象并对其进行排序。如何将这些结果组合到一个数组中,该数组键入Person对象的最后和名字以及Department对象的部门名称,如下所示:

    Accounting                                    5-5544
    Almond, Betty         Accounting              5-5544
    Almond, Robert        Shipping                5-4345
    Brown, John           Building Maintenance    5-5566
    Building Maintenance                          5-5566 ...

2 个答案:

答案 0 :(得分:1)

使用排序的名字和姓氏的示例

史密斯约翰 安徒生简 克拉克安妮 史密斯大卫 约翰逊罗斯

使用NSDescriptor

排序

排序描述符不仅可用于排序数组,还可用于指定应如何排列表视图中的元素,还可以使用Core Data指定从获取请求返回的对象的顺序。使用排序描述符,您可以通过多个键轻松地对数组进行排序。我们将按姓氏和名称对数组进行排序。

NSSortDescriptor *firstDescriptor = [[NSSortDescriptor alloc] initWithKey:@"surname" ascending:YES];
NSSortDescriptor *secondDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];

NSArray *sortDescriptors = [NSArray arrayWithObjects:firstDescriptor, secondDescriptor, nil];

NSArray *sortedArray = [self.persons sortedArrayUsingDescriptors:sortDescriptors];

结果数组如下所示:

安徒生简 克拉克安妮 约翰逊罗斯 史密斯大卫 史密斯约翰

答案 1 :(得分:0)

一个例子:

NSArray *combinedArray = [self.persons arrayByAddingObjectsFromArray:self.departments];
NSArray *sortedArray = [combinedArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    NSString *name1 = ([obj1 isKindOfClass:[Person class]]) ? [[(Person *)obj1 lastName] stringByAppendingString:[(Person *)obj1 firstName]] : [(Department *)obj1 name];
    NSString *name2 = ([obj2 isKindOfClass:[Person class]]) ? [[(Person *)obj2 lastName] stringByAppendingString:[(Person *)obj2 firstName]] : [(Department *)obj2 name];

    return [name1 caseInsensitiveCompare:name2];
}];