1

Scripting Bridge 経由で iTunes からトラックのリストを取得しようとしています。それが推奨される方法なNSPredicateので、私は使用しています。これは場合によっては非常にうまく機能しますが、他の場合には使用できないほど遅くなります。たとえば、これは非常に迅速に実行されます。

NSString *formatString = @"artist == ABC AND album == XYZ";
NSPredicate *trackFilter = [NSPredicate predicateWithFormat:formatString];
NSArray *tracksToPlay = [[libraryPlaylist fileTracks] filteredArrayUsingPredicate:trackFilter];

(libraryPlaylist他の場所で作成された iTunesLibraryPlaylist オブジェクトです。)

しかし、ミックスに または のいずれかを追加するkindvideoKind、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これは、がすでに結果を返していることを意味するにすぎません。

4

1 に答える 1

0

別の投稿が間接的に答えを見つけるのに役立ちました。

「ライブラリ」プレイリストを使用すると、多くの異常な問題が発生します。代わりに「音楽」プレイリストを使用すると、それらが修正されるようです。上記の例では、このように設定libraryPlaylistすると問題が発生します。

iTunesApplication *iTunes = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"];
iTunesSource *library = [[[[iTunes sources] get] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"kind == %i", iTunesESrcLibrary]] objectAtIndex:0];
iTunesLibraryPlaylist *libraryPlaylist = [[[library libraryPlaylists] objectAtIndex:0];

「ライブラリ」プレイリストの代わりに「ミュージック」プレイリストを取得することが答えです。

iTunesApplication *iTunes = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"];
iTunesSource *library = [[[[iTunes sources] get] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"kind == %i", iTunesESrcLibrary]] objectAtIndex:0];
iTunesLibraryPlaylist *libraryPlaylist = [[[[library playlists] get] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"specialKind == %i", iTunesESpKMusic]] objectAtIndex:0];
その他の注意事項

元の質問の"albumArtist == ABC AND album == XYZ"フィルターは、実際にはかなり速く実行されていました。遅いのは、後で結果を処理することです。getすぐに電話することは部分的な解決策です。(get他のものと同じくらい遅く実行されますが、前もって実行することで、速度の低下を単一の操作に制限します。また、 でgetのみ機能することに注意してくださいSBElementArray。)

また、呼び出しによって速度が低下することもわかりましたfileTracks。代わりに使用tracksすると修正されます。したがって、フィルターは次のようになります。

NSArray *tracksToPlay = [(SBElementArray *)[[libraryPlaylist tracks] filteredArrayUsingPredicate:trackFilter] get];

(「ライブラリ」を使用する場合、プレイリストに追加する必要がfileTracksあるプロパティを持つオブジェクトのみが返されます。「ミュージック」に切り替えた後は、場所を持つオブジェクトも返されるようです。)locationtracks

于 2012-01-19T19:43:23.593 に答える