从ios媒体库中检索元信息的最快方法?

时间:2013-02-27 23:41:40

标签: ios objective-c

我正在尝试从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秒)。

1 个答案:

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