我正在尝试从ios媒体库中检索元信息,然后将其发送到json中的服务器。
但是,我发现循环遍历MPMediaQuery结果并将元信息拉得很慢。
MPMediaQuery *query = [[MPMediaQuery alloc]init];
MPMediaPropertyPredicate *predicate = [MPMediaPropertyPredicate predicateWithValue:[NSNumber numberWithInteger:MPMediaTypeMusic] forProperty:MPMediaItemPropertyMediaType];
[query addFilterPredicate:predicate];
NSMutableArray *songs = [[NSMutableArray alloc] init];
songs = [query items];
[songs enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
[obj valueForProperty:MPMediaItemPropertyTitle];
[obj valueForProperty:MPMediaItemPropertyPlaybackDuration];
[obj valueForProperty:MPMediaItemPropertyArtist];
[obj valueForProperty:MPMediaItemPropertyAlbumTitle];
[obj valueForProperty:MPMediaItemPropertyGenre];
[obj valueForProperty:MPMediaItemPropertyAlbumTrackNumber];
}];
对于包含9000首歌曲的库,完成枚举循环可能需要25秒才能完成。
是否有更快的方式来批量检索元信息?在这种情况下,ValueForProperty效率非常低(循环中的每次调用都会增加大约5秒)。
答案 0 :(得分:3)
MPMediaItem
的文档指出,使用enumerateValuesForProperties:usingBlock:
通常比单独调用valueForProperty:
更快。试试这个:
NSSet *properties = [NSSet setWithArray:@[ MPMediaItemPropertyTitle, MPMediaItemPropertyPlaybackDuration, MPMediaItemPropertyArtist, MPMediaItemPropertyAlbumTitle, MPMediaItemPropertyGenre, MPMediaItemPropertyAlbumTrackNumber ]];
[songs enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
MPMediaItem *item = (MPMediaItem *)obj;
[item enumerateValuesForProperties:properties usingBlock:^(NSString *property, id value, BOOL *stop) {
// do something with this property / value pair
}];
}];