Objective C keypath从iTunes中获取所有艺术家

NSA*_*ict 9 enumeration objective-c key-value-coding nspredicate

我正在使用键值编码来获取iTunes中的所有艺术家:

[self.iTunes valueForKeyPath:@"sources.@distinctUnionOfArrays.playlists.@distinctUnionOfArrays.tracks.artist"];
Run Code Online (Sandbox Code Playgroud)

现在,这很好用.这非常有效.我也想对专辑做同样的事情.

[self.iTunes valueForKeyPath:@"sources.@distinctUnionOfArrays.playlists.@distinctUnionOfArrays.tracks.album"];
Run Code Online (Sandbox Code Playgroud)

这里的问题是,有多个相同名称的专辑,但不一定是同一个艺术家.有没有办法获得每张专辑的歌曲,所以我可以找出它是什么艺术家,并获得它的封面?我知道有NSPredicate,但这很慢.

具体代码并不重要,我只需要键值编码部分.

谢谢!

Quu*_*one 4

这不是一个完整的答案。

为了像我这样最初不知道记录在哪里的人的利益:您必须在安装了 iTunes 的 Mac 上,然后运行命令

sdef /Applications/iTunes.app | sdp -fh --basename iTunes
Run Code Online (Sandbox Code Playgroud)

iTunes.h这将神奇地在您当前的工作目录中创建。然后您可以仔细iTunes.h查看 API 的外观。Mac 开发者库或其他内容中似乎没有正式记录它。

除了属性之外,每个属性iTunesTrack还有一个属性,所以我认为您真正想做的就是返回一个唯一元组的数组。artistalbum(album, artist)

好的,那么我们如何从单个 KVC 查询中获取元组数组呢?例如,我们想编写类似的内容sources.@distinctUnionOfArrays.playlists.@distinctUnionOfArrays.tracks.albumAndArtist并让它返回类似NSArrayof 的内容NSDictionary@[ @{ @"Help!", @"The Beatles" }, @{ @"No!", @"They Might Be Giants" }, ... ]

编辑ughoavgfhw 在评论中建议下一步:您可以使用类别来定义,albumAndArtist如下所示:

@interface iTunesTrack (albumAndArtist)
@property (readonly) NSDictionary *albumAndArtist;
@end

@implementation iTunesTrack (albumAndArtist)
-(NSDictionary *) albumAndArtist
{
    return @{ @"album":self.album, @"artist":self.artist };
}
@end
Run Code Online (Sandbox Code Playgroud)

现在你可以写出我们想要写的那一行:

[self.iTunes valueForKeyPath:@"sources.@distinctUnionOfArrays.playlists.@distinctUnionOfArrays.tracks.albumAndArtist"];
Run Code Online (Sandbox Code Playgroud)

这应该会给你一个NSArrayof NSDictionary,这基本上就是你想要的。请注意,我还没有测试过这段代码或任何东西!

  • 您可以使用类别来定义返回字典的“albumAndArtist”属性,然后将该属性与 KVC 一起使用来获取所有不同的对。 (2认同)