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使用する方が高速であると述べています。これを試して: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 に答える