我正在尝试通过 Scripting Bridge 从 iTunes 中获取曲目列表。我正在使用NSPredicate
,因为这是推荐的方式。这在某些情况下效果很好,而在其他情况下却非常缓慢。例如,这将很快执行:
NSString *formatString = @"artist == ABC AND album == XYZ";
NSPredicate *trackFilter = [NSPredicate predicateWithFormat:formatString];
NSArray *tracksToPlay = [[libraryPlaylist fileTracks] filteredArrayUsingPredicate:trackFilter];
(libraryPlaylist
是在别处创建的 iTunesLibraryPlaylist 对象。)
但如果我添加其中一个kind
或videoKind
混合,iTunes 会在一分钟或更长时间内达到 100% CPU。
NSString *formatString = @"artist == ABC AND album == XYZ AND kind != 'PDF document' AND videoKind == %@", ;
NSPredicate *trackFilter = [NSPredicate predicateWithFormat:formatString, [NSAppleEventDescriptor descriptorWithTypeCode:iTunesEVdKNone]];
NSArray *tracksToPlay = [[libraryPlaylist fileTracks] filteredArrayUsingPredicate:trackFilter];
但这最终会奏效。真正的失败是albumArtist
。如果我尝试
NSString *formatString = @"albumArtist == ABC AND album == XYZ";
NSPredicate *trackFilter = [NSPredicate predicateWithFormat:formatString];
NSArray *tracksToPlay = [[libraryPlaylist fileTracks] filteredArrayUsingPredicate:trackFilter];
iTunes 将达到 100% CPU 并坐在那里不知道多久。(我在 3 或 4 分钟后放弃了。)我是否遗漏了什么或者这是 iTunes 中的错误?
附加信息
我的代码采用生成的曲目并调用另一种方法将它们添加到播放列表(也使用脚本桥)。我注意到,当尝试按种类过滤时,曲目会慢慢地一一出现在列表中,而 iTunes 会敲击 CPU。这只能意味着它filteredArrayUsingPredicate
已经返回了它的结果,那么iTunes如此努力的工作是什么?