Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从ios媒体库检索元信息的最快方法?_Ios_Objective C - Fatal编程技术网

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

从ios媒体库检索元信息的最快方法?,ios,objective-c,Ios,Objective C,我试图从ios媒体库中检索元信息,然后用json将其发送到服务器 然而,我发现在MPMediaQuery结果中循环并提取元信息的速度非常慢 MPMediaQuery *query = [[MPMediaQuery alloc]init]; MPMediaPropertyPredicate *predicate = [MPMediaPropertyPredicate predicateWithValue:[NSNumber numberWithInteger:MPMediaTypeMusic] f

我试图从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秒)。

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

利用你的建议,我设法把时间缩短了一半。谢谢我还可以做其他优化吗?我只知道这些。也许您可以缓存结果,只在需要时获取项目的属性。