2

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

4

1 回答 1

3

MPMediaItem说明 using通常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
    }];
}];
于 2013-02-28T00:18:16.103 回答