多个NSMutableArrays,一个按谓词排序,另一个相对重新排序

时间:2013-03-08 23:03:20

标签: ios objective-c arrays cocoa-touch nsarray

我正在开发一个音乐应用程序,当我管理TableView时,我将它们分类为Sections。这通常是一个简单的过程,但按照我管理的方式管理数据,这可能不是一个完全简单的任务。

我知道这不是最好的方法,但由于单元格有多个属性(titleLabel,textLabel,imageView),我将所有数据存储在3个独立的数组中。按标题组织歌曲时,对于节标题,我使用谓词设置titleLabel,因此使用此代码。

NSArray *predict = [mainArrayAll filteredArrayUsingPredicate:predicate];
cell.titleLabel.text = [predict objectAtIndex:indexPath.row];

不幸的是,我还有其他的Array和其他人。这些都有艺术家姓名,专辑插图等数据,因此需要与他们的歌曲相关。有没有办法以与mainArrayAll数组相同的方式重新排序这些其他数组?那么相关数据是保持在一起的吗?

1 个答案:

答案 0 :(得分:3)

在上面的例子中,我建议你创建一个模型类实现来存储所有的值。以下MVC architecture是最佳方式。

例如: -

@interface Music : NSObject {}

@property (nonatomic, strong) NSString *title;
@property (nonatomic, strong) NSString *artistName;
@property (nonatomic, strong) NSString *albumName; 
//etc...

@end

现在,如果您想创建音乐数组,请按以下步骤操作:

Music *myMusic1 = [[Music alloc] init];
myMusic1.title = @"name";
myMusic1.artistName = @"artist";//etc.. do this in a loop based on other contents array

NSMutableArray *array = [NSMutableArray arrayWithObjects:myMusic1, myMusic2, ... nil];

现在排序这个数组:

NSArray *sortedArray = [array sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
    return [a.title compare:b.title];
}];

如果你想使用谓词:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K contains %@", @"title", @"name"];
NSArray *predict = [mainArrayAll filteredArrayUsingPredicate:predicate];

如果要在表格视图中使用这些属性,可以将其用作:

NSString *title = [[sortedArray objectAtIndex:indexPath.row] title];
NSString *artistName = [[sortedArray objectAtIndex:indexPath.row] artistName];