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 に 1 分以上かかります。
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 を叩いている間、トラックが 1 つずつゆっくりとリストに表示されることに気付きました。filteredArrayUsingPredicate
これは、がすでに結果を返していることを意味するにすぎません。