我已经进入 iOS 编程几个星期了,还有很多东西要学。我有一种包含 MPMediaItems 的 NSMutableArray 工作,但是对于 1200 个项目,它慢了大约 10 秒,我正在寻找一种更快的方法。
我的最终目标是拥有一个 MPMediaItemCollection 项目数组,每个项目代表一个专辑。我无法从 MPMediaQuery(据我所知)中获取此信息,因为我需要从播放列表中获取歌曲。因此,我正在对从特定播放列表(“过去 4 个月”)中获得的歌曲进行排序,然后构建我自己的收藏集。正如我所说,下面的方法有效,但速度很慢。即使我只按 MPMediaItemPropertyAlbumTitle 排序,它仍然需要大约 4 秒(iPhone 4S)。
编辑:我应该提到我尝试了排序描述符,但我无法获得工作的关键。例如
NSSortDescriptor *titleDescriptor = [[NSSortDescriptor alloc] initWithKey:@"MPMediaItemPropertyAlbumTitle" ascending:YES];
这会返回一个错误
[<MPConcreteMediaItem 0x155e50> valueForUndefinedKey:]: this class is not key value coding-compliant for the key MPMediaItemPropertyAlbumTitle.
编码
MPMediaQuery *query = [MPMediaQuery playlistsQuery];
NSArray *playlists = [query collections];
NSMutableArray *songArray = [[NSMutableArray alloc] init];
for (MPMediaItemCollection *playlist in playlists) {
NSString *playlistName = [playlist valueForProperty: MPMediaPlaylistPropertyName];
NSLog (@"%@", playlistName);
if ([playlistName isEqualToString:@"Last 4 months"]) {
/* replaced this code with a mutable copy
NSArray *songs = [playlist items];
for (MPMediaItem *song in songs) {
[songArray addObject:song];
}
*/
// the following replaces the above for-loop
songArray = [[playlist items] mutableCopy ];
[songArray sortUsingComparator:^NSComparisonResult(id a, id b) {
NSString *first1 = [(MPMediaItem*)a valueForProperty:MPMediaItemPropertyAlbumTitle];
NSString *second1 = [(MPMediaItem*)b valueForProperty:MPMediaItemPropertyAlbumTitle];
NSString *first2 = [(MPMediaItem*)a valueForProperty:MPMediaItemPropertyAlbumPersistentID];
NSString *second2 = [(MPMediaItem*)b valueForProperty:MPMediaItemPropertyAlbumPersistentID];
NSString *first3 = [(MPMediaItem*)a valueForProperty:MPMediaItemPropertyAlbumTrackNumber];
NSString *second3 = [(MPMediaItem*)b valueForProperty:MPMediaItemPropertyAlbumTrackNumber];
NSString *first = [NSString stringWithFormat:@"%@%@%03d",first1,first2, [first3 intValue]];
NSString *second = [NSString stringWithFormat:@"%@%@%03d",second1,second2, [second3 intValue]];
return [first compare:second];
}];
}
}